Разное

Java работа с датами: Date Time и Calendar в Java. Руководство с примерами

Как получить последний день месяца

30 сентября 2020

Тэги: Java, Java 8, Kotlin, алгоритмы.

При работе с датами часто бывает нужно получить последний день текущего месяца или года. Поскольку последний день года всегда равен 31 декабря, то мы можем напрямую создать эту дату с помощью метода LocalDate.of(). А вот последний день месяца зависит от конкретного месяца. Дней в месяце может быть 30 или 31, а для февраля и вовсе 28 или 29.

Чтобы не разбираться в логике работы календаря, начиная с Java 8 (а, значит, и в Kotlin) нам доступен специальный класс TemporalAdjusters. Он имеет несколько полезных методов, но в данном случае нас интересует lastDayOfMonth(), возвращающий специальный объект с интерфейсом TemporalAdjuster

. Этот интерфейс содержит метод adjustInto(), который позволяет «выравнивать» любую переданную ему дату (или дату со временем) по определённому правилу. В нашем случае дата будет выровнена по последнему дню месяца.

val lastDateOfCurrentMonth = TemporalAdjusters.lastDayOfMonth()
    .adjustInto(LocalDate.now()) // выравниваем текущую дату
val lastDateTimeOfCurrentMonth = TemporalAdjusters.lastDayOfMonth()
    .adjustInto(LocalDateTime.now()) // выравниваем текущую дату и время

Как видите, метод adjustInto() одинаково хорошо работает и с датой, и с датой и временем. В последнем случае выравнивается только дата. Время остаётся без изменений.

Помимо метода lastDayOfMonth(), класс TemporalAdjusters предлагает также и другие методы с говорящими названиями:

  • lastDayOfYear() — последний день года
  • firstDayOfMonth() — первый день месяца
  • firstDayOfNextMonth() — первый день следующего месяца
  • firstDayOfYear() — первый день года
  • firstDayOfNextYear() — первый день следующего года

Но остальные «выравниватели» менее интересны, т. к. первый день месяца или года всегда равен 1, а последний день года всегда равен 31.


Облако тэгов

Kotlin, Java, Java 16, Java 11, Java 10, Java 9, Java 8, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи

  • Список статей
  • Кеширование в Spring Boot
  • Springdoc для документации REST API
  • Работа с коллекциями в Kotlin и Java
  • Советы по работе с BigDecimal в Java
  • Алгоритм определения палиндрома
  • Удаление записи через DELETE-запрос в Spring Boot
  • Обновление записи через PUT-запрос в Spring Boot
  • Добавление записи через POST-запрос в Spring Boot
  • Работа с БД в Spring Boot на примере postgresql
  • Spring Boot Restful Service
  • Решето Эратосфена для поиска простых чисел
  • Алгоритм поиска простых чисел
  • Построчное чтение больших файлов на Java
  • Как сохранить текстовый файл на Java
  • Алгоритм чисел Фибоначчи на Java и Kotlin
  • Работа с системой контроля версий git из консоли
  • Бинарный поиск на отсортированном массиве
  • Как парсить HTML на Java с помощью Jsoup
  • Настройка Ubuntu под хостинг JVM приложения

Работа с датами | JIRA

Вы можете управлять датами создания, обновления, датирования и разрешения (а также пользовательским полем «Выбор даты» («Date Picker»)) и форматировать их внутри полей, поддерживающих интеллектуальные значения. Функции и атрибуты даты находятся в разделе справки по датам.

Старый синтаксис

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

Форматирование дат

Вы указываете формат даты в конце умного значения:

// использование встроенных форматов

{{issue.resolutiondate.asLongDateTime}}

{{issue.MyDateFieldName.longDateTime}}

{{issue.created.jqlDateTime}}

{{issue.created.mediumTime}}

{{issue.Sprint.endDate.jiraDate}} - отформатируйте дату окончания поля Sprint в формат, подходящий для установки другого поля

// Или вы можете указать формат

{{issue.dueDate.format("dd/MM/yyyy")}}

{{issue.created.as("dd MMM")}}

См. Полный список доступных форматов дат в нашем справочном руководстве.

Локаль (формат даты на основе местоположения)

Вы можете указать языковой стандарт для печати дат (по умолчанию — «США»).

// Печатает дату создания выпуска на французском языке

{{issue. created.withLocale ("fr"). asLongDateTime}}

// Печатает дату создания выпуска на французском канадском языке

{{issue.created.locale ("fr_CA"). longDateTime}}

// Выводит дату создания задачи в локали репортера

{{issue.created.locale (issue.reporter.locale) .longDateTime}}

Список локалей см. в документации Java.

Часовой пояс

Даты отображаются в часовом поясе Jira по умолчанию.

// Преобразует время создания задачи в новый часовой пояс,

// например 10:00 UTC конвертируется в 8:00 AEST{{issue.created.convertToTimeZone ("Australia/Sydney")}}

// Преобразует время создания задачи в новый часовой пояс и сохраняет то же самое

// раз / даты. Например. 10:00 UTC меняется на 10:00 AEST

{{issue.created.setTimeZone ("Australia/Sydney")}}

Список часовых поясов см. в документации Java.

Укажите часовой пояс пользователя:

// Печатает время создания задаче в часовом поясе репортеров.

{{issue.created.convertToTimeZone (issue.reporter.timeZone)}}

Управление датами

Управляйте датами, задавая части даты или добавляя / вычитая из нее значения:

// Добавляем 7 дней к текущему времени

{{now.plusDays (7)}}

 

// Вы можете связать функции

// Установите дату создания на 1 ноября

{{issue.created.withDayOfMonth (1) .withMonth (11)}}

Атрибуты даты

Получить отдельные атрибуты дня, например месяц

// Получаем сегодняшний день месяца

{{now.dayOfMonth}}

// Получаем день недели, когда проблема была создана

{{issue.created.dayOfWeekName}}

// Получаем название дня недели на французском языке

{{issue.created.locale ("fr"). dayOfWeekName}}

Расчет рабочих дней

Плюс / минус рабочих дней с текущей даты или найти ближайший рабочий день к текущей дате. Рабочие дни считаются с понедельника по пятницу.

// На следующий рабочий день

{{now. toBusinessDay ()}}

// На следующий рабочий день через 3 дня

{{now.plusDays (3) .toBusinessDay ()}}

// Предыдущий рабочий день

{{now.toBusinessDayBackwards ()}}

// Добавляет 6 рабочих дней к сегодняшнему дню

{{now.plusBusinessDays (6)}}

// Первый рабочий день месяца

{{now.firstBusinessDayOfMonth}}

// Последний рабочий день месяца

{{now.lastBusinessDayOfMonth}}

// Количество рабочих дней до создания задачи и сегодня

{{now.diff (issue.created) .businessDays}}

Расчет разницы между двумя датами

Метод «diff» для вычисления разницы между двумя датами путем передачи другой даты и последующего указания единиц измерения.

// Получает количество часов с момента создания задачи

{{now.diff (issue.created) .hours}}

// Получает количество дней между двумя датами

{{now.diff (issue.created) .days}}

// Чтобы показать положительные даты, используйте метод "abs"

{{now. diff (issue.created) .abs.days}}

Сравнение двух дат

Вы можете сравнить две даты. Эти методы принимают в качестве параметра другую дату.

// Возвращает "истину"

{{now.isAfter (issue.created)}}

Подсказка

Сравните даты, используя условие сравнения.

Преобразование текста в даты

Когда дата является текстом, например в журнале изменений даты хранятся в виде текста:

{{issue.summary.toDate}}

Преобразуйте текст в дату, если он имеет правильный формат. Вы можете указать формат для преобразования, добавив параметр. В приведенном ниже примере преобразуется текст, например «2017 6 11» в объект даты.

{{issue.summary.toDate("yyyy MM dd")}}

После преобразования текста в объект Date вам может потребоваться его дальнейшее преобразование, например для поля измененного (например, прослушивание изменения даты)

{{fieldChange.fromString.toDate.plusDays (1) . longDate}}

Ссылка на текущую дату / время

Вы можете указать текущую дату и время, используя {{сейчас}}

Пример

// 1 мая этого года

{{now.startOfMonth.withMonth (5)}}

// 1 мая следующего года

{{now.startOfMonth.withMonth (5) .plusYears (1)}}

 

// последний день мая

{{now.withMonth (5) .endOfMonth}}

// первый рабочий день мая

{{now.withMonth (5) .firstBusinessDayOfMonth}}

// последний рабочий день мая

{{now.withMonth (5) .lastBusinessDayOfMonth}}

По материалам Automation for Jira — Server: Working with dates

java — Как правильно работать с датами на Android

0

Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.

Я работаю над проектом Android с Kotlin, где нам нужно выполнять проверки дат как с устройства, так и с нашего бэкэнда. До сих пор мы работали с классом Date для представления дат, с классом SimpleDateFormat для анализа строк и форматирования дат и с классом Calendar для выполнения операций с датами, таких как получение даты x дней назад и тому подобное. Я столкнулся с некоторыми ресурсами, в которых говорится, что правильный способ работы с датами — использовать пакет java.time (такие классы, как LocalDateTime, LocalTime и т. д.). Мне интересно точно знать, как правильно работать с датами (от парсинга до форматирования) и нужно ли учитывать часовые пояса. Я видел похожие вопросы, но ни один из них не резюмирует то, что я хотел бы знать.

  • Java
  • Android
  • Дата
  • Котлин
  • Java-время

2

Правильный способ работы

Для правильной работы с датами и временем необходимо, чтобы вы что-то понимали в том, что такое даты и время и как они ведут себя в реальной жизни ваших пользователей. Правильная работа заключается не в использовании того или иного библиотечного класса. В зависимости от работы, которую вы выполняете, вам нужно будет знать о високосных годах и/или юлианском, григорианском и пролептическом григорианском календаре и/или многих различных системах солнечного и лунного календаря.

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

Рекомендуемые библиотечные классы для использования

Настоятельно рекомендуется использовать java.time, современный API даты и времени Java, для работы с датой и временем. По сравнению с устаревшими классами даты и времени из Java 1.0 и 1.1 есть некоторые отличия:

  • Старые классы делают вид, что некоторые вещи просты, хотя на самом деле это не так, некоторые программисты не осознают сложности правильной обработки даты и времени и оставляют ошибки в своем коде, которые остаются незамеченными. Современные классы во многих случаях заставляют программиста решать, чего мы хотим, оставляя гораздо меньше места для непреднамеренных ошибок. Мы должны решить, хотим ли мы дату, время или и то, и другое, какой часовой пояс мы хотим и т. д. и т. д.
  • В том же духе старые классы делают вид, что даты и время одинаковы и могут рассматриваться как с часовыми поясами, так и без них, что неверно. Полагая, что это приведет к всевозможным ошибкам в крайних случаях. Используя java.time, вам нужно выбрать между LocalDate , Instant , ZonedDateTime и многие другие классы даты и времени, которые поначалу могут показаться хлопотными, но которые сделают ваш код более понятным и повысят шансы на то, что он также правильный.
  • Во многих случаях старые классы принимают ввод/аргументы мусора, опять же позволяя очевидным ошибкам оставаться незамеченными. Современные классы выполняют гораздо большую работу по проверке.
  • Старые классы, как правило, не ориентированы на многопотоковое исполнение. Современные есть.

Ссылки

  • Видео на YouTube: Проблема со временем и часовыми поясами — Computerphile
  • Oracle Tutorial: Date Time
  • Техническая статья Oracle Java SE 8 Дата и время
  • Все еще используете java.util.Date? Не! на Советы по программированию
  • Что не так с Java Date & Time API? [закрыто]
  • Ответ Джона Скита на Почему январь месяц 0 в календаре Java? ; интересная часть — это РЕДАКТИРОВАТЬ во второй половине ответа

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Документация JDK 19 — Главная

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *