tl; dr
java.util.Date // The terrible awful nasty old class that you should never use. Represents a moment in UTC, with a resolution of milliseconds.
.from( // Convert from modern class to legacy class.
Instant // Represent a moment in UTC, with a resolution of nanoseconds.
.now() // Capture the current moment in UTC.
.plus( // Add some span-of-time.
Duration.ofDays( 7 ) // Generic chunks of 24-hours, without regard for the calendar.
) // Returns another `Instant` object, per immutable objects pattern.
) // Returns a legacy `java.util.Date` object.
java.time
Современный подход использует java.time классы.
Никогда не используйте java.util.Date
.Это ужасный класс со многими недостатками.Его вытеснили годы назад классами java.time , в частности Instant
.Вы можете конвертировать туда и обратно, используя новые методы, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
через одну неделю после текущей даты
Определите «неделю».Вы имеете в виду добавление семи календарных дат?Если да, какое время суток вы хотите получить в результате?Если нет, то хотите ли вы добавить серию из семи общих 24-часовых дней?
7 * 24 часа
Если вы хотите добавить семь общих 24-часовых дней, используйте Instant
сa Duration
A Duration
- это число целых секунд плюс дробная секунда в нанослоях.
Возможно, именно это вы и имели в виду под загадочным упоминанием в своем вопросе «без *»1034 * java.util.Date` в UTC.
Duration sevenChunksOf24Hours = Duration.ofDays( 7 ) ; // *NOT* calendar days.
Instant now = Instant.now() ; // Capture current moment in UTC.
Instant later = now.plus( d ) ; // Add the duration to the `Instant` thereby generating another `Instant`.
Семь календарных дней
Добавление дней означает работу с датами в календаре.Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .
Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше указать явно желаемый / ожидаемый часовой пояс в качестве аргумента.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Добавить семь календаря дней.
LocalDate weekLater = today.plusWeeks( 1 ) ;
Чтобы получить момент, нам нужно указать время суток и часовой пояс.Если вы хотите первый момент дня, пусть java.time определит этот момент.Никогда не принимайте 00:00 как начало дня.Аномалии, такие как переход на летнее время (DST), могут означать, что день начинается в другое время, например 01:00.
ZonedDateTime zdt = weekLater.atStartOfDay( z ) ;
Если вы хотите увидеть то же значение в течение времени по Гринвичу, извлеките Instant
.Instant
всегда в UTC, по определению.
Instant instant = zdt.toInstant() ;
Одна неделя - это, например, одна неделя, один месяц или два месяца.
В этом случае вместо жесткого кодирования вызова на LocalDate::plusWeeks
передайте Period
(количество лет-недель-месяцев-дней) и позвоните LocalDate::plus
.A Period
использует календарные дни, не общие 24-часовые дни.Дни в календаре могут оказаться любой длины, например, 23, 23,5, 25 часов, причем все они не имеют отношения к Period
.
Period p = Period.ofMonths( 2 ) ;
LocalDate later = today.plus( p ) ; // Pass a `Period` for an number of years-weeks-months-days. A `Period` uses calendar-days, *not* generic 24-hour periods of time.
ZonedDateTime zdt = weekLater.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
Если вам нужно java.util.Date
для взаимодействия со старым кодом, который еще не обновлен до java.time , преобразуйте.
java.util.Date d = java.util.Date.from( instant ) ;
О программе java.time
Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .