тип данных datetime в java - PullRequest
       18

тип данных datetime в java

14 голосов
/ 29 июня 2011

Какой тип данных я могу использовать в Java для хранения текущей даты, а также времени ?. Я хочу сохранить дату и время в БД, а также иметь поле в Java-бине для хранения этого.

это java.util.Date?

Ответы [ 8 ]

24 голосов
/ 29 июня 2011

java.util.Date представляет мгновенный во времени, без ссылки на конкретный часовой пояс или систему календаря. Тем не менее, он содержит и дату, и время - это в основном количество миллисекунд, начиная с эпохи Unix.

В качестве альтернативы вы можете использовать java.util.Calendar, который знает об обеих этих вещах.

Лично я бы настоятельно рекомендовал бы использовать Joda Time , что на намного более богатый API даты / времени. Это позволяет вам выразить ваши данные намного более четко, с типами «просто даты», «просто местное время», «местная дата / время», «мгновенный», «дата / время с часовым поясом» и т. Д. Большинство типов также являются неизменяемыми, что является огромным преимуществом с точки зрения ясности кода.

10 голосов
/ 29 июня 2011
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

private String getDateTime() {
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date date = new Date();
    return dateFormat.format(date);
}
4 голосов
/ 12 апреля 2016

java.time

Среда java.time, встроенная в Java 8 и более поздние версии, вытесняет как старые классы даты и времени, связанные с ранними версиями Java, так и библиотеку Joda-Time. Классы java.time были перенесены обратно на Java 6 и 7 и на Android.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд.

Instant instant = Instant.now();

Применить смещение от UTC (количество часов и возможных минут и секунд), чтобы получить OffsetDateTime.

ZoneOffset offset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , offset );

Еще лучше применение полного часового пояса, который является смещением, плюс набор правил для обработки аномалий, таких как летнее время (DST).

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

База данных

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

Используйте новые методы, добавленные к старым классам, для преобразования в / из java.time. Ищите to… и valueOf методы.

Используйте класс java.sql.Timestamp для значений даты и времени.

java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );

И идет в другом направлении ...

Instant instant = ts.toInstant();

Для данных даты и времени вам практически всегда нужен тип данных TIMESTAMP WITH TIME ZONE вместо WITHOUT при проектировании столбцов таблицы в вашей базе данных.

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

+ 1 рекомендация для Joda-time.Если вы планируете делать что-то большее, чем простой пример Hello World, я предлагаю прочитать это:

Рекомендации по переходу на летнее время и часовой пояс

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

Я использовал этот импорт:

import java.util.Date;

И объявил мою переменную так:

Date studentEnrollementDate;
1 голос
/ 29 июня 2011

Зависит от СУБД или даже драйвера JDBC.

В большинстве случаев вы можете использовать java.sql.Timestamp в большинстве случаев вместе с подготовленным оператором:

pstmt.setTimestamp( index, new Timestamp( yourJavaUtilDateInstance.getTime() );
0 голосов
/ 12 апреля 2016

Начиная с Java 8, похоже, стандартная библиотека java.time - это путь. С Время Joda Веб-страница:

Обратите внимание, что начиная с Java SE 8 и далее пользователей просят перейти на java.time (JSR-310) - основную часть JDK, которая заменяет этот проект.


Вернуться к вашему вопросу. Если бы вы использовали Java 8, я думаю, вы хотите LocalDateTime. Потому что он содержит дату и время дня, но не знает ни о часовом поясе, ни о каком-либо контрольном моменте времени, таком как эпоха Unix.

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

Вы можете использовать Календарь.

     Calendar rightNow = Calendar.getInstance();

Календарь

Date4j альтернатива дате, календарю и связанным классам Java

...