Я остановлюсь на правильном ответе от JeroenWyseur.
ISO 8601
Стандартный формат ISO 8601 является абсолютно лучшим способом сериализации значения даты и времени для обмена данными. Формат является однозначным, интуитивно понятным для людей разных культур и все более распространенным во всем мире. Легко читается как для людей, так и для машин.
2015-01-16T20:15:43+02:00
2015-01-16T18:15:43Z
В первом примере смещение на 2 часа опережает UTC. Во втором примере показано обычное использование Z
(«зулу») для обозначения UTC, сокращение от +00:00
.
java.time
Классы java.util.Date & .Calendar, связанные с Java, общеизвестно хлопотны, сбивают с толку и имеют недостатки. Избежать их. Вместо этого используйте:
- Пакет java.time, встроенный в Java 8, на основе Joda-Time, определенный JSR 310.
Пакет java.time заменяет своего предшественника, библиотеку Joda-Time .
По умолчанию обе библиотеки используют ISO 8601 как для синтаксического анализа, так и для генерации строковых представлений значений даты и времени.
Обратите внимание, что java.time расширяет формат ISO 8601, добавляя собственное имя часового пояса , например 2007-12-03T10:15:30+01:00[Europe/Paris]
.
Найдите в StackOverflow.com сотни вопросов и ответов с большим количеством обсуждений и примеров кода.
Избегайте отсчетов из эпохи
В некоторых других ответах рекомендуется использовать число, отсчет от эпоха . Этот подход не практичен. Это не самоочевидно. Он не читается человеком, что делает отладку хлопотной и неприятной.
Какое это число, целые секунды, которые обычно используются в Unix, миллисекунды, используемые в java.util.Date & Joda-Time, микросекунды, обычно используемые в базах данных, таких как Postgres, или наносекунды, используемые в java.time package ?
Какая из пары дюжин эпох , первый момент 1970 года использовался в Unix, год 1 использовался в .Net & Go, «январь 0, 1900» использовался в миллионах (миллиардах?) Excel & Lotus электронные таблицы, или 1 января 2001 года используется Какао ?
См. мой ответ на аналогичный вопрос для дальнейшего обсуждения.
LocalDate
Я передаю некоторые объекты через веб-сервис, и некоторые из них содержат java.sql.Date
Замена для ужасного java.sql.Date
класса java.time.LocalDate
.
Лучше всего полностью избегать унаследованного класса, но вы можете конвертировать туда и обратно, вызывая новые методы, добавленные к старому классу: myJavaSqlDate.toLocalDate()
Сериализация LocalDate
Класс LocalDate
реализует Serializable
. Таким образом, у вас не должно возникнуть проблем с автоматическим сериализацией, как маршалингом, так и демаршаллингом.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .