Получите первый день и последний день месяца с мгновенного - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть метод, использующий 2 Instants в параметрах getIssuesBillable(Instant start, Instant end, ....), мой вопрос: как я получаю первый день месяца и последний день месяца, используя Java 8 Instant?Я уже пытался использовать withDayOfMonth() и lengthOfMonth():

LocalDate initial = LocalDate.now();
LocalDate start = initial.withDayOfMonth(firstDayOfMonth());
LocalDate end = initial.withDayOfMonth(lastDayOfMonth());

Но в этом случае мне нужно преобразовать и сделать некоторые обходные пути в этом случаеЕсли кто-то знает лучший способ сделать это, я действительно ценю любой ответ.

1 Ответ

0 голосов
/ 28 сентября 2018

tl; dr

Используйте современные java.time классы.

Вот краткий бессмысленный пример начала с Instant (момент в UTC)назначение часового пояса для просмотра этого момента через часы настенного времени, используемые людьми определенного региона (часового пояса), извлечение года и месяца в том виде, в каком оно воспринимается в этом часовом поясе, и определение первого и последнего днятого месяца, рендеринг LocalDate объектов.

YearMonth                                 // Represent a year-and-month, the entire month as a whole.
.from(                                    // Determine the year-and-month of some other date-time object.
    Instant                               // Represent a moment in UTC.
    .now()                                // Capture the current moment in UTC.
    .atZone(                              // Adjust from UTC to a particular time zone.
        ZoneId.of( "Pacific/Auckland" ) 
    )                                     // Returns a `ZonedDateTime` object.
)                                         // Returns a `YearMonth` object.
.atDay( 1 )                               // Returns a `LocalDate` object.

… или

…
.atEndOfMonth()                           // Returns a `LocalDate` object.

Кстати, реалистичная версия этого конкретного кода будет: YearMonth.now( ZoneId.of( "Pacific/Auckland" ) ).atDay( 1 )

Момент против даты *

Instant - это момент в UTC , дата с указанием времени дня и смещение .с-UTC ноль.

A LocalDate - это значение только для даты, без времени суток и без часовой пояс .

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

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

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

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

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

Извлечение только даты.

LocalDate ld = zdt.toLocalDate() ;

Оттуда перейдите к другому коду.

Или работайте с месяцем в целом, используя YearMonth класс.

YearMonth ym = YearMonth.from( zdt ) ;
LocalDate first = ym.atDay( 1 ) ;
LocalDate last = ym.atEndOfMonth() ;

Совет: LocalDateRange* может оказаться полезным.Классы 1080 * и Interval в библиотеке ThreeTen-Extra .

Подсказка: узнайте о подходе Half-Open, чтобы определить промежуток времени, где начало включительно , а окончание эксклюзив .Таким образом, месяц начинается с первого и продолжается, но не включает первый день месяца , следующего за .


О 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
    • LaВ трех версиях реализации 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 .

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