Влияет ли изменение времени на функцию сравнения даты Java?

Мы пытаемся сравнить дату, хранящуюся в mySQL, с обычным текстовым полем даты, прочитанным из оригинала сообщения Gmail, используя сравнение даты java.

В первый раз обычный текст сообщения Gmail Дата читается и сохраняется в поле базы данных mySQL «date_sent» типа TIMESTAMP. В следующий раз, когда это сообщение проверяется, оно получает обычный текст сообщения Date и, используя функцию сравнения даты Java, сравнивает его с сохраненным значением date_sent.

Это сравнение обычно работает. Однако -- если дата и время сравниваемой даты сообщения относятся к часу ночи дня, в котором время изменилось (летнее время на стандартное), сравнение завершается ошибкой.

Кто-нибудь испытал это? как ты смог это исправить?


person Linda    schedule 11.11.2013    source источник


Ответы (2)


Похоже, вам предстоит тяжелая битва. Если приходит сообщение, датированное 1:30 ночи, в день, когда заканчивается переход на летнее время, я не думаю, что есть какой-либо способ определить, является ли это ПЕРВЫМ появлением 1:30 ночи (до того, как часы вернутся назад) или ВТОРЫМ.

Предположительно, вы никогда не получите сообщение, датированное 1:30 утра в день начала летнего времени, потому что этого времени на самом деле не существует.

Поэтому, если вы сделаете это, преобразовав текстовое поле в дату и сохранив ее, у вас всегда будет проблема, как сравнивать такие даты. Иногда ваше сравнение может быть неправильным, если вы выберете неправильный 1:30 утра, и я не думаю, что вы можете с этим поделать слишком много, если хотите, чтобы ваши часовые пояса были правильными как для летнего времени, так и для стандартного времени.

Одна вещь, которую вы можете рассмотреть, — это хранить временные метки в виде текста, а не в виде дат, чтобы преобразование никогда не происходило. Если вы используете такой формат, как yyyy-MM-dd HH:mm:ss, вы сможете выполнять сравнение текста вместо сравнения дат и получать правильные результаты.

person Dawood ibn Kareem    schedule 11.11.2013
comment
Спасибо, Дэвид, приятно слышать такие же мысли от кого-то еще! Мы обдумывали идею перехода на хранение в виде текста и выполнение этого сравнения, но надеялись, что сможем избежать необходимости изменять поле в базе данных mySQL с TIMESTAMP на Text и преобразовывать существующие данные. Однако это выглядит как самый надежный способ сравнения. Есть ли способ конвертировать из одного в другой, или мне нужно будет воссоздать данные из исходного источника? - person Linda; 12.11.2013
comment
Конечно. Класс SimpleDateFormat предназначен для того, чтобы вы могли конвертировать временные метки и текст туда и обратно. Тщательно подумайте о том, какой часовой пояс вы хотите использовать, потому что вы все равно получите ту же проблему, если вы конвертируете временные метки в текст, который находится в часе ночи в день окончания летнего времени; то есть они выйдут из строя. В зависимости от того, как это будет использоваться, вам может быть лучше использовать часовой пояс, в котором нет летнего времени, когда вы выполняете первоначальное преобразование. Таким образом, ваши временные метки останутся в последовательности, даже если некоторые из них могут быть неправильными. - person Dawood ibn Kareem; 12.11.2013

Я никогда не испытывал этого, потому что я никогда этого не делал. Я думаю, что вам нужно будет получить/узнать часовой пояс текстовой даты, преобразовать его в объект Date (используя этот часовой пояс), а затем сравнить даты таким образом.

Вы говорите, что используете метод сравнения Date, но это говорит о том, что он требует Date в качестве входных данных. Так вы уже конвертируете? Пожалуйста, покажите нам этот код. Вы проходите в часовом поясе?

Кроме того, этот вопрос содержит очень полезную информацию, которую вы можете использовать .

person Daniel Kaplan    schedule 11.11.2013
comment
Спасибо за информацию, это хорошо для размышления. Сначала мы продолжим текстовое сравнение маршрута и посмотрим, что из этого получится! - person Linda; 12.11.2013