Несоответствие объекта Date (). Месяц, день и год не верны - PullRequest
1 голос
/ 16 марта 2011

Сейчас 15.03.11, и когда я вызываю новый объект даты:

Date now = new Date();

Я получаю взамен

  • месяц как 2 (getMonth()),
  • день как 2 (getDay())
  • и год (getYear()) как 111.

Есть ли причина для этого соглашения?

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Прямо от Документация класса :

  • Год y представлен целым числом y - 1900.
  • Месяц представлен целым числом от 0 до 11; 0 - январь, 1 - февраль и т. Д .; таким образом, 11 - декабрь.
  • Дата (день месяца) представляется целым числом от 1 до 31 в обычном порядке.

А что касается getDay():

Возвращает день недели, представленный этой датой. Возвращенное значение (0 = воскресенье, 1 = понедельник, 2 = вторник, 3 = среда, 4 = четверг, 5 = пятница, 6 = суббота) представляет день недели, который содержит или начинается с момента времени, представленного Объект даты, интерпретируемый в местном часовом поясе.

15 марта 2011 года фактически является вторником.

2 голосов
/ 16 марта 2011

Есть ли причина для этого соглашения?

Причина в том, что это именно то, что указывает javadoc для Date;см. ответ @matt b. ​​

API Date были созданы во времена JDK 1.0, и, как известно, проблематичны в ряде областей.Вот почему большинство методов Date помечены как устаревшие.(Кстати, это означает, что рекомендуется не использовать их в новом коде !!)

API Calendar значительно улучшают Date, но являются лучшими на сегодняшний день API.для обработки значений даты / времени в Java используются сторонние Joda time API.


Если вам нужны примеры использования времени Joda, посмотрите ссылку выше.Есть пример использования Календаря в GregorianCalendar javadocs .Больше примеров использования Календаря можно найти на этой странице .

1 голос
/ 13 апреля 2019

ТЛ; др

LocalDate                              // Modern class to represent a date-only value, without time-of-day, without time zone or offset-from-UTC.
.now( ZoneId.of( "Africa/Tunis" ) )    // Capture the current date as seen in the wall-clock time used by the people of a specific region (a time zone).
.getYear()                             // Get year number, such as 2019 presently.

... и:

.getMonthValue()                       // Get month number, 1-12 for January-December.

… и:

.getDayOfMonth()                       // Get day-of-month number, 1-31.

Подробнее

Очевидно, вы используете один из двух ужасных классов даты и времени, java.util.Date или java.sql.Date. Оба устарели с момента принятия JSR 310, определяющего их замену, современными java.time классами.

LocalDate

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса или смещения от UTC .

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

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

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

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

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

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Или укажите дату. Вы можете установить месяц по номеру, с нормальным номером 1-12 для января-декабря.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Или, лучше, использовать предварительно определенные объекты перечисления Month, по одному на каждый месяц года. Совет: используйте эти Month объекты по всей вашей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументируемым, обеспечить допустимые значения и обеспечить type-safety . То же самое для Year & YearMonth.

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Доступ к частям даты

Классы java.time используют вменяемую нумерацию, 1-12 для месяцев, 1-7 для дней недели, номер года, например 2019, является 2019 годом и т. Д.

int year = ld.getYear() ;                 // The year, such as 2019 presently.
int monthNumber = ld.getMonthValue() ;    // Number of the month 1-12 for January-December.
Month month = ld.getMonth() ;             // Get the `Month` enum object, one of a dozen predefined objects (one for each month of the year). 
int dayOfMonth = ld.getDayOfMonth() ;     // Get the day of the month, 1-31. 

О 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 .

...