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