Сравнивая MySQL и Java Time - PullRequest
5 голосов
/ 01 июня 2011

У меня есть поле даты и времени в MySQL, к которому я обращаюсь через вызов result.getString ('date'), теперь я хотел бы проверить, превысила ли текущая дата и время в Java время MySQL или раньше, чем время MySQL для проверить погоду результат активирован или нет.

Datetime из MySQL имеет вид: 2011-12-30 17:10:00, как я могу сравнить эту строку со временем Java?

Ответы [ 6 ]

4 голосов
/ 01 июня 2011

В Java вы можете создать Date из строки, используя SimpleDateFormat:

String text = "2011-12-30 17:10:00";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(text);
Date now = new Date();

if (date.after(now))
{
    // do stuff
}

Вместо этого вы можете выполнять аналогичные операциив базе данных, используя основные арифметические и (я думаю ) операторы равенства: +, -, >, < и т. д., а также дата и время MySQLфункции .

... хотя мне любопытно узнать, почему вы используете getString() вместо ResultSet#getTimestamp().


Oneдругой совет: рассмотрите возможность использования Joda Time вместо java.util.Date и java.util.Calendar.См. Должен ли я использовать классы даты и времени Java или использовать стороннюю библиотеку, такую ​​как Joda Time?

3 голосов
/ 01 июня 2011

До JDK 8

Вы можете использовать ResultSet.getDate('date') для получения объекта Date.Затем используйте метод Date.before() или Date.after() для проверки.

JDK 8 или более поздней версии

См. Ответ 1011 * Базеля Бурка ниже.

1 голос
/ 29 марта 2016

tl; dr

JDBC 4.2 и более поздние версии:

Boolean isFutureTask = myResultSet.getObject( "myDateColumn" , Instant.class )
                                  .isAfter( Instant.now() ) ;

Старые JDBC:

Boolean isFutureTask = myResultSet.getTimestamp( … )
                                  .toInstant()
                                  .isAfter( Instant.now() ) ;

java.time

Другие ответыбыли правильны, но использовали устаревшие классы.java.util.Date / .Calendar классы были вытеснены структурой java.time , встроенной в Java 8 и более поздние версии.

Чтобы узнать больше, см. Oracle Tutorial .И поищите в Stack Overflow множество примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .

Типы даты и времени

Вы должны хранить значения даты и времени в виде типа даты и времени в вашей базе данных .Я считаю, что это будет TIMESTAMP типа в MySQL (но я Postgres человек сам).

Затем используйте тип java.sql.Timestamp для перемещения данныхв / из базы данных.

java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );

Немедленно конвертировать из java.sql в java.time.Классы java.sql являются частью тех старых классов даты и времени, которые оказались плохо спроектированными, запутанными и хлопотными.Используйте их только до тех пор, пока драйверы JDBC не будут обновлены для непосредственной работы с типами java.time.

Старый java.util.Timestamp имеет новые методы для преобразования в / из Instant.Instant - это момент времени на UTC с разрешением наносекунд.

java.time.Instant instant = ts.toInstant();

Получить текущий момент.

Instant now = Instant.now();

Сравнить.

Boolean isStoredDateTimePast = now.isAfter( instant );

В JDBC 4.2 и более поздних версиях ваш драйвер JDBC может иметь прямой доступ к значению из базы данных как объект Instant через ResultSet::getObject method.


Если вам необходимо проанализировать эту строку, преобразуйте ее в стандартный формат ISO 8601.Замените пространство посередине на T.Предполагая, что строка представляет нулевое смещение от UTC, добавьте Z для Zulu, что означает UTC.Классы java.time по умолчанию анализируют / генерируют строки в форматах ISO 8601.

String inputOriginal = "2011-12-30 17:10:00".
String input = inputOriginal.replace( " " , "T" ) + "Z" ;
Instant instant = Instant.parse( input );
1 голос
/ 01 июня 2011

Почему бы вам просто не использовать getDate('date') вместо getString() и использовать даты before() или after()?

0 голосов
/ 01 июня 2011

java.util.Calendar.getInstance().getTime().getTime() покажет вам текущую дату и время в миллисекундах

ResultSet.getDate('name of column').getTime()

даст вам дату и время из базы данных ....

вы можете сравнивать / выполнять логические операции, как вы делаете с числами ..... например, это будет проверять, больше ли системное время, чем дата / время из базы данных

java.util.Calendar.getInstance().getTime().getTime() > new java.sql.Date(WIDTH).getTime();

Вы можете найти в документации API более подробную информацию об этих методах ....

Надеюсь, это поможет

0 голосов
/ 01 июня 2011

Вы можете использовать API Joda DateTime, который очень прост для сравнения дат, у нас есть такое же требование в использовании, как в формате mysql datetime и создает объекты joda datetime для сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...