Как получить объект даты для желаемой даты в Java? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть такой объект даты, как

Date d = new Date();

, который будет возвращать текущую дату и время.Но мне нужно назначить этот объект даты для моей желаемой даты.Например: через неделю после текущей даты, как это без использования класса календаря в Java.Там в любом случае?Существует конструктор, подобный

Date d = new Date(millis); 

, который даст дату с 1 января 1970 г. до миллисдисной добавленной стоимости.Так есть ли способ узнать этот миллис на одну неделю после текущей даты.Например, одна неделя может быть одна неделя, один месяц или два месяца.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

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?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздние версии - часть стандартного Java API с комплексной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 13 декабря 2018

По вашему вопросу

Но мне нужно назначить этот объект даты для моей желаемой даты. Так есть ли способ узнать этот миллис в течение одной недели после текущей даты.Например, одна неделя может быть одна неделя, один месяц или два месяца.

Я предполагаю, что вы хотите указать дату и проверить, что она наступила после или до какого-то другого.Вы можете достичь этого, используя пакет синхронизации java 8, как показано ниже:

LocalDateTime ldt = LocalDateTime.of(2018,12,13,20,0,0,0);

System.out.println(ldt.plusDays(5).isAfter(LocalDateTime.now()));

вывод: true.

Вы можете сравнить LocalDateTime.now() сам с другим localDateTime или установитьточная дата и plusDays() plusMonths() методы для добавления дня / месяца / часа и т. д.

Или вы можете сравнить ваш Date сейчас с несколькими днями после него, используя LocalDateTime, как показано ниже:

Date date = new Date();

LocalDateTime ld = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

System.out.println(ld.isAfter(ld.plusDays(5)));

вывод: false

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