ТЛ; др
Как правильно получить первую дату текущего месяца?
LocalDate.now()
.with( TemporalAdjusters.firstDayOfMonth() )
Или…
YearMonth.now().atDay( 1 )
Или…
LocalDate.now().with ( ChronoField.DAY_OF_MONTH , 1 )
java.time
Структура java.time в Java 8 и более поздние версии заменяют старые классы java.util.Date/.Calendar. Старые классы оказались хлопотными, запутанными и ошибочными. Избежать их.
Структура java.time вдохновлена очень успешной библиотекой Joda-Time , определенной JSR 310 , расширенный Проект ThreeTen-Extra и объясняется в Учебник .
<Код> LocalDate
For a date-only value, without time-of-day, use the <Код> LocalDate class. While <Код> LocalDate has no assigned time zone, we must specify a time zone in order to determine a date such as “today”. For example, a new day dawns earlier in Paris than in Montréal.
Часовой пояс имеет решающее значение для определения сегодняшней даты. В любой данный момент дата изменяется по всему миру по зонам. Опускание часового пояса означает, что текущий часовой пояс JVM автоматически применяется при определении текущей даты. Любой код в JVM может изменять значение по умолчанию во время выполнения, поэтому вы ходите по смещающимся пескам. Лучше указывать желаемый/ожидаемый часовой пояс явно, чем неявно ссылаться на текущий дефолт.
Укажите правильное название часового пояса в формате континент/регион
, например Америка/Монреаль
, Африка/Касабланка
, или Pacific/Auckland
, Никогда не используйте аббревиатуру 3-4 символов, например EST
или IST
, поскольку они являются not истинными часовыми поясами, не стандартизированы и даже не уникальны ( !).
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfCurrentMonth = today.with ( ChronoField.DAY_OF_MONTH , 1 );
Сбросьте консоль.
System.out.println ( "For zoneId: " + zoneId + " today is: " + today + " and first of this month is " + firstOfCurrentMonth );
Для zoneId: Америка/Монреаль сегодня: 2015-11-08 и первый из этого месяца - 2015-11-01
Кроме того, используйте TemporalAdjuster
. Для вашей цели вы найдете удобные реализации в TemporalAdjusters
(обратите внимание на множественное число s
), в частности firstDayOfMonth
.
LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;
<Код> ZonedDateTime
Если вам нужно время суток, помните, что 00: 00: 00.000
not всегда первый момент дня из-за летнего времени (DST) и, возможно, других аномалий , Поэтому пусть java.time определяет правильное время первого момента дня.
ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
<Р> 2015-11-01T00: 00-04: 00 [Америка/Монреаль]
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time теперь находится в режим обслуживания , советует перейти на java.time .
Дополнительные сведения см. В Учебное пособие по Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация JSR 310 .
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами , Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Интервал
, YearWeek
, < код> YearQuarter и подробнее ,