Java 8 добавление дней без временных сегментов - PullRequest
0 голосов
/ 01 июня 2018

Java 8 здесь.Я пытаюсь взять текущий Date (сейчас), добавить к нему один день и получить новый экземпляр Date, представляющий завтрашний день, в котором нет компонента времени (только год, месяц и день).Моя лучшая попытка:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, 1);

Date tomorrow = calendar.getTime();

Но когда я печатаю tomorrow, он содержит компонент времени (пример: Sat Jun 02 14:04:59 EDT 2018), тогда как я просто хочу, чтобы он содержал обнуленные значения для часа / месяца / минуты/ etc (так: Sat Jun 02 00:00:00 EDT 2018).Как я могу сделать это?В конце концов, я просто хочу Date экземпляр, который представляет завтрашнюю дату, поэтому в псевдокоде:

Date now = new Date();  // 2018-06-01
Date tomorrow = now.plus(1, DAY); // 2018-06-02

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

tl; др

Никогда не используйте java.util.Date класс.

Вместо этого используйте java.time .

LocalDate.now()           // Capture the current date as seen in the wall-clock time of the JVM’s current default time zone.
         .plusDays( 1 )   // Move to tomorrow’s date. Returns a fresh `LocalDate` object rather than modifying (“mutating”) the original, per immutable objects pattern.
         .toString()      // Generate a String representing this date value. Use standard ISO 8601 format: YYYY-MM-DD.

2018-06-03

Неправильный тип

получить новый экземпляр Date, представляющий завтрашний день, в котором нет компонента времени (только год, месяц идень).

Вы используете класс «дата со временем дня» для представления значения только для даты.Квадратный колышек, круглое отверстие.

Вместо этого используйте класс только для даты: LocalDate.

Избегайте устаревших классов

Вы используете ужасные старые классы даты и времени, которые были вытеснены годами назад ведущими в отрасли java.time классами.

Я пытаюсь взять текущую дату (сейчас)

Получить текущую дату, позвонив по номеру LocalDate.now.

LocalDate today = LocalDate.now() ;

Этот вызов неявно применил текущий часовой пояс по умолчанию вашей JVM для определения текущей даты.Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента.Если опущено, текущее значение по умолчанию JVM применяется неявно.Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.

LocalDate today = LocalDate.now( ZoneId.systemDefault() ) ; 

добавить один деньк этому

Легко.Вызовите метод LocalDate::plusDays.Классы java.time используют шаблон неизменных объектов .Поэтому вместо того, чтобы изменять («изменять») исходный объект, создается новый свежий объект.

LocalDate tomorrow = today.plusDays( 1 ) ;

В некоторых ситуациях вам может потребоваться указать количество времени, которое нужно добавить в качестве самого объекта.Используйте Period для количества лет, месяцев, дней.

Period p = Period.ofDays( 1 ) ;
LocalDate localDate = today.plus( p ) ;

Strings

Чтобы сгенерировать String, представляющее значение нашего LocalDate, позвоните toString, еслиВы хотите стандартный формат ISO 8601 .Стандартный формат, кажется, то, что вы хотите.

String output = tomorrow.toString() ;  // Generate String in standard ISO 8601 format, YYYY-MM-DD.

2018-01-23

Пользовательский шаблон форматирования можно указать с помощью DateTimeFormatter.Или, лучше, пусть тот же класс автоматически локализуется для вас с помощью его методов ofLocalized….


About java.time

java.time Framework встроен в 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 API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
  • 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 голосов
/ 01 июня 2018

Calendar.getInstance () будет содержать компоненты текущего времени, поэтому вам нужно удалить компоненты времени из экземпляра Calendar.

Вот правильный код:

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.DAY_OF_YEAR, 1);

    // Clear time components
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    Date tomorrow = calendar.getTime();

Другое дело, что выне использует Java 8 Date / Time API.Ниже для Java 8 +

    LocalDate today = LocalDate.now();

    LocalDate tomorrow = today.plusDays(1);
    java.util.Date tomorrowUtilDate = java.sql.Date.valueOf(tomorrow);
...