Russian Qt Forum
Сентябрь 30, 2024, 14:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Неоднозначность при использовании QDateTime  (Прочитано 6092 раз)
Odyssey
Гость
« : Июнь 22, 2011, 09:19 »

В программе мне приходится переводить QDateTime в строку и обратно (команды toString и fromString). Беда в том, что формат представления должен быть таков, что год записывается двумя цифрами.
Собственно, можно ведь 01-01-11 прочитать и как 1 января 2011 года и как 1 января 1911 года (оба варианта допустимы, а из строки понять нельзя). Так вот оно у меня и происходит.
В некоторых случаях цифры года распознаются правильно, а в некоторых - нет.
Что делать для снятия этой неоднозначности?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июнь 22, 2011, 09:20 »

Вручную корректировать?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Июнь 22, 2011, 10:51 »

Если есть возможность - изменить формат передачи даты. ( Если нужно выводить так - это не значит что надо именно так передавать)
Если невозможно отказаться от такого формата передачи времени то вы неправильно написали программу, но точно знаете, что год может быть в пределах, скажем от 1951 до 2050, то можно вручную при обратном конвертировании проверять и подправлять, как посоветовал Пантер.
Если вы передаёте в таком формате и не знаете промежутка допустимых лет, то восстановить дату вы не сможете.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июнь 22, 2011, 10:54 »

Что делать для снятия этой неоднозначности?
Может хранить дату в time_t?
Записан

Qt 5.11/4.8.7 (X11/Win)
Denjs
Гость
« Ответ #4 : Июнь 22, 2011, 11:58 »

Что делать для снятия этой неоднозначности?
Решение проблемы лежит вне области программирования, а в области требований к программе. в данном случае - к входным и выходным данным. В данных же документах должно зафиксировать что формат с 2-я цифрами года - "не однозначен"(из данных - XX-XX-XX нельзя однозначно понять формат) (впрочем и в случае года с 4-я цифрами тоже не всегда - в пиндостании, кажется, так исторически сложилось, что распространен формат "месяц-день-год" - "XX-XX-XXXX") .

Потому в сопроводительных документах и помощи/подсказках надо четко указывать что и в каком формате вы требуете/ожидаете на входе.

Что делать?
1) поменять формат представления на тот, который не вызывает неоднозначности. скажем на "yyyy.MMM.dd".
2) использовать "QDateTime::fromString ( const QString & string, const QString & format )" с явным указанием формата - format="yy-MM-dd", или "dd-MM-yy"  - но что-то одно и _везде_.

Не пытайтесь предугадать тараканов в голове пользователя. Не пытайтесь угадать формат входных данных.
Просто требуйте вводить дату в заданном формате и все.

Не надо брать на себя ответственность за "неправильный разбор данных" в условиях когда формат не известен и тем более не однозначен.
Вынесите эту ответственность из области проектирования программы в область рантайма и переложите эту ответственность на оператора, снабдив его соответствующими подсказками. Исправить поведение оператора можно, а предугадать данные с которыми он работает - нельзя.
имха))
« Последнее редактирование: Июнь 22, 2011, 12:15 от Denjs » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июнь 22, 2011, 13:11 »

Может хранить дату в time_t?
Если старые версии Qt не нужны, то лучше MSecsSinceEpoch. У time_t диапазон дат довольно узок и тот же 1911 в нём вообще представить нельзя.
Записан
Odyssey
Гость
« Ответ #6 : Июнь 22, 2011, 16:28 »

Спасибо большое.
Решил тем, что попросту изыскал способ перейти на формат "yyyy".
Пантер предложил версию явной проверки в программе значения QDateTime и изменения ее на 100 лет, если значение меньше определенной даты. Тоже работало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.