calendar java день недели
Как определить день недели, передав конкретную дату в Java?
Краткое и практическое руководство по определению дня недели на Java.
1. Обзор
В этом коротком уроке мы увидим, как извлечь день недели в виде числа и текста из даты Java.
2. Проблема
Бизнес – логика часто нуждается в дне недели. Почему? Во-первых, рабочее время и уровень обслуживания различаются между рабочими и выходными днями. Поэтому получение дня в виде числа необходимо для многих систем. Но нам также может понадобиться день в качестве текста для отображения.
Итак, как мы извлекаем день недели из дат на Java?
3. Решение С java.util.Date
java.util.Date является классом Java date начиная с Java 1.0. Код, который начался с Java версии 7 или ниже, вероятно, использует этот класс.
3.1. День недели как число
Во-первых, мы извлекаем день в виде числа с помощью java.util.Календарь :
3.2. День недели в виде текста
4. Решение С java.time.LocalDate
Java 8 переработала обработку даты и времени и представила java.time.LocalDate для дат. Поэтому Java-проекты, которые работают только на Java версии 8 или выше, должны использовать этот класс!
4.1. День недели как число
Извлечение дня в виде числа тривиально сейчас:
4.2. День недели в виде текста
Теперь мы снова извлекаем день в виде текста. Мы также передаем в Locale :
Классы Date, Calendar, TimeZone
Для удобной работы с датой и временем в Java используются классы Date и Calendar. Оба класса находятся в библиотеке java.util. Класс TimeZone используется совместно с классами Calendar и DateFormat
Класс SimpleDateFormat является подклассом класса DateFormat и позволяет определять собственные шаблоны форматирования для отображения даты и времени.
На странице рассмотрены следующие классы :
Класс Date
Класс Date хранит время в миллисекундах начиная с 1 января 1970 года. Данный класс имеет конструктор по умолчанию, который возвращает текущее время. Кроме этого можно создать объект Date используя конструктор, который принимает количество миллисекунд начиная с 1 января 1970 года. Для получения этого внутреннего времени используется метод getTime(). Кроме этого уже после создания экземпляра класса можно изменить время с помощью setTime(long date).
Конструкторы класса Date :
Первый конструктор без параметров инициализирует объект текущей датой и временем. Во втором конструкторе можно указать количество миллисекунд, прошедших с полуночи 1 января 1970 года.
Методы класса Date:
Простой пример использования Date для вывода даты в консоль.
С помощью метода getTime() можно отобразить количество миллисекунд, прошедших с 1 января 1970 года.
Класс SimpleDateFormat
Для того, чтобы отображать дату и время в удобном формате можно использовать класс SimpleDataFormat :
При создании шаблона представления даты SimpleDateFormat использовались следующие параметры :
В качестве разделитель можно использовать любой текст.
Класс SimpleDateFormat является подклассом класса DateFormat и позволяет определять собственные шаблоны форматирования для отображения даты и времени.
Символы форматирования строки
Количество повторений символа определяет способ представления даты. Например, можно указать hh:mm:ss, а можно h:m:s. В первом случае при необходимости для чисел 0..9 будет отображаться ноль перед цифрой.
Класс Calendar
В документации представлено множество методов для получения или установки отдельных компонентов времени и даты, например, getMinutes()/setMinutes() и др. Все они являются устаревшими и вместо них следует использовать класс Calendar.
Пример использования классов Calendar и GregorianCalendar
Поля класса Calendar
Методы класса Calendar
Наименование | Описание |
---|---|
abstract void add(int field, int value) | добавляет value к компоненту времени или даты, указанному в параметре field (например, Calendar.HOUR). Чтобы отнять, используйте отрицательное значение. |
boolean after(Object calendar) | возвращает значение true, если вызывающий объект класса Calendar содержит более позднюю дату, чем calendar. |
boolean before(Object calendar) | возвращает значение true, если вызывающий объект класса Calendar содержит более раннюю дату, чем calendar. |
final void clear() | обнуляет все компоненты времени в вызывающем объекте. |
final void clear(int field) | обнуляет компонент, указанный в параметре field |
int get(int field) | возвращает значение одного компонента, например, Calendar.MINUTE |
synchronized static Locale[] getAvailableLocales() | возвращает массив объектов класса Locale, содержащий региональные данные |
synchronized static Calendar getInstance() | возвращает объект класса Calendar для региональных данных и часового пояса по умолчанию. Есть и другие перегруженные версии. |
final Date getTime() | возвращает объекта класса Date, содержащий время, эквивалентное вызывающему объекту. |
TimeZone getTimeZone() | возвращает часовой пояс |
final boolean isSet(int field) | возвращает значение true, если указанный компонент времени указан. |
void set(int field, int value) | устанавливает компоненты даты или времени. Есть перегруженные версии. |
final void setTime(Date date) | устанавливает различные компоненты даты и времени через объект класса Date. |
void setTimeZone(TimeZone timezone) | устанавливает часовой пояс через объект класса TimeZone. |
Календарь достаточно мощный класс, который позволяет получать названия месяцев и дней недели, увеличивать или уменьшать различные параметры текущей даты, а также получать их. Для удобства работы с ним нужно просто разобраться с типами данных, с которыми он работает:
Пример Calendar, GregorianCalendar
Класс GregorianCalendar
Класс GregorianCalendar является подклассом Calendar, который представляет обычный Григорианский календарь. Метод getInstance() класса Calendar обычно возвращает объект класса GregorianCalendar, инициированный текущей датой и временем согласно региональным настройкам.
Кроме стандартных методов, которые есть в классе Calendar, у GregorianCalendar есть метод isLeapYear() для проверки високосного года:
Если год високосный, то возвращается true.
Отсчёт месяцев идёт от нуля, поэтому декабрь будет одиннадцатым месяцем. Чтобы не путаться с такими случаями, проще использовать понятные константы:
А получать нужные отрезки времени можно через метод get (). Например, узнать, какой месяц содержится в созданной нами дате можно так:
Изменить состояние объекта можно через метод set (). Например, установим новую дату у нашего объекта.
Можно сдвинуть дату на определённый период с помощью метода add (). Отодвинем дату на два месяца.
Методы getTime() и setTime() работают с объектами Date и полезны для преобразования.
Класс TimeZone
Класс TimeZone предназначен для совместного использования с классами Calendar и DateFormat. Этот класс абстрактный, поэтому от него порождать объекты нельзя. Вместо этого определен статический метод getDefault(), который возвращает экземпляр наследника TimeZone с настройками, взятыми из операционной системы, под управлением которой работает JVM.
TimeZone имеет статический метод getTimeZone(String ID), используя который можно указать наименование конкретного временного пояса, для которого необходимо получить объект TimeZone.
Набор полей, определяющих возможный набор параметров для getTimeZone, нигде явно не описывается. Но имеется статический метод getAvailableIds(), возвращающий список возможных значений наименование временных зон типа String[], который можно использовать в методе getTimeZone. Так можно определить набор возможных параметров для конкретного временного пояса относительно Гринвича String[] getAvailableIds(int offset).
Рассмотрим пример, в котором на консоль последовательно выводятся:
— временная зона по умолчанию;
— список всех возможных временных зон;
— список временных зон, которые совпадают с временной зоной Москвы.
Пример получения списка TimeZone
Код программы несложный. Метод align выполняет выравнивание для отображения смещения по времени TimeZone от среднего времени по Гринвичу GMT — времени меридиана, проходящего через прежнее место расположения Гринвичской обсерватории около Лондона. Метод drawTimeZoneParam отображает параметры TimeZone. В конструкторе класса TimeZoneList сначала определяется текущая TimeZone, после чего выводится список возможных TimeZone. И в заключении, используя метод getAvailableIDs получаем список TimeZone, у которых смещение по времени соответствует текущей зоне.
В результате работы программы в консоль будет выведена следующая информация (первый список в усеченном виде):
TimeZone UTC
UTC было введено вместо устаревшего среднего времени по Гринвичу (GMT), поскольку GMT является неравномерной шкалой и связана с суточным вращением Земли. Шкала UTC основана на равномерной шкале атомного времени и является более удобной для гражданского использования.
Как может влиять TimeZone, с точки зрения разработчика, на результаты работы программы? Давайте представим себе ситуацию, что время формируется на сервере (объект типа Date) и отправляется удаленному пользователю по сети. Это типично для WEB-приложений, у которых сервер и пользователи (браузеры) могут быть расположены в разных временных зонах. Для отправки объекта Date по сети (Internet) используется сериализация, позволяющая упаковать объект в набор байт на сервере и восстановить объект типа Date на клиенте (браузере). И вот здесь Вас может ожидать «засада». Если сервер и клиент имеют разные TimeZone (часовые пояса), то на клиенте будет восстановлен объект Date с временем сервера. И наоборот, если объект будет отправлен с клиента на сервер, то на сервере объект десериализуется с временем клиента.
Конечно, объект Date можно конвертировать не сервере в текстовый вид, используя DateFormat, и на клиенте его восстановить. Но Java позволяет учитывать различные TimeZone, не оказывающие влияние на сериализацию/десериализацию объектов типа Date.
Давайте рассмотрим пример TimeZoneExample (код представлен ниже), в котором время будем привязывать к одной из сторон (желательно серверной), а на компьютере устанавливать различные зоны (UTC, Москва, Владивосток). Для установки определенной временной зоны необходимо открыть в панели управления окно «Date and Time» и выбрать соответствующую TimeZone.
Первоначально на компьютере устанавливаем зону UTC и получаем в консоли следующий текст :
Здесь следует сказать, что для зоны UTC и для зоны Москвы неформатированные даты (date, dt_msk) совпадают, но вот с учетом временной зоны форматированные даты отличаются на соответствующие 3 часа.
Теперь установим зону на компьютере зону Москвы и получим в консоли следующий текст :
Если приложение должно работать в определенной временной зоне TimeZone, то можно, используя метод setDefault класса TimeZone, установить соответствующую временную зону в приложении при работе с датой. В примере можно было бы снять комментарий с первой строки и установить сответствующую временную зону в приложении, не оказывая влияния на временную зону в настройках компьютера.
Скачать исходный код примера
Исходный код рассмотренных примеров можно скачать здесь (6.69 Кб).
Как определить день недели, пройдя конкретную дату?
Для примера у меня есть дата: “23/2/2010” (23 февраля 2010 г.). Я хочу передать его функции, которая вернет день недели. Как я могу это сделать?
В этом примере функция должна возвращать String “Tue”.
Кроме того, если требуется только порядковый номер дня, как это можно извлечь?
Да. В зависимости от вашего конкретного случая:
Вы можете использовать java.util.Calendar :
Используйте этот код для поиска имени дня с даты ввода. Простой и хорошо протестированный.
Результат: сб, 28 дек 2013
Конструктор по умолчанию принимает локаль “по умолчанию”, поэтому будьте осторожны, когда используете конкретный шаблон.
ТЛ; др
Посмотрите этот код в режиме реального времени на IdeOne.com (но Locale.US работает только Locale.US ).
java.time
Посмотрите мой пример кода выше, и посмотрите правильный Ответ для java.time от Przemek.
Порядковый номер
если нужен только порядковый номер дня, как его можно получить?
Но если вы настаиваете, спросите у DayOfWeek номер. Вы получаете 1-7 за понедельник-воскресенье по стандарту ISO 8601.
Joda времени
ОБНОВЛЕНИЕ: проект Joda-Time сейчас находится в режиме обслуживания. Команда советует перейти на классы java.time. Инфраструктура java.time встроена в Java 8 (а также перенесена обратно на Java 6 и 7 и дополнительно адаптирована для Android).
Вот пример кода с использованием библиотеки Joda-Time версии 2.4, как упомянуто в принятом ответе Божо. Joda-Time намного превосходит классы java.util.Date/.Calendar, связанные с Java.
LocalDate
Joda-Time предлагает класс LocalDate для представления только даты без какого-либо времени суток или часового пояса. Как раз то, к чему призывает этот Вопрос. Старые классы java.util.Date/.Calendar в комплекте с Java не имеют этой концепции.
парсить
Разобрать строку в значение даты.
экстракт
Извлечение из значения даты день недели номер и название.
свалка
Бежать
О java.time
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, см. Учебник по Oracle. И поиск для многих примеров и объяснений. Спецификация JSR 310.
Где взять классы java.time?
java.time
Использование java.time framework, встроенного в Java 8 и более поздних версиях.
Вы можете попробовать следующий код:
Еще один “забавный” способ – использовать Doomsday algorithm. Это более длинный метод, но он также быстрее, если вам не нужно создавать объект Calendar с указанной датой.
Можно использовать следующий фрагмент кода для ввода типа (день = “08”, месяц = “05”, год = “2015”, а выход будет “СРЕДА”)
Получение Номера Недели С Любой Даты
Узнайте, как получить номер недели для заданной даты на Java.
1. введение
2. До Java 8
2.1. Получить Номер Недели С Помощью Полей Календаря
Давайте рассмотрим наш первый пример:
Теперь давайте посмотрим, как вызвать этот метод из одного из наших модульных тестов:
Мы должны быть осторожны при принятии этого подхода, так как поле месяца в классе Calendar основано на нуле. Это означает, что если мы хотим указать декабрь, то нам нужно использовать число 11, что часто может привести к путанице.
2.2. Получить Номер Недели С Помощью Настроек Локали
В этом предпоследнем примере мы рассмотрим, какой эффект может иметь применение некоторых дополнительных настроек к нашему Календарю :
Класс Calendar определяет два метода:
Эти методы влияют на то, как мы вычисляем номер недели. Обычно оба эти значения берутся из Локали при создании Календаря . Но также можно установить первый день недели и минимальные дни в первую неделю года вручную.
2.3. Языковые различия
Локаль играет важную роль в том, как рассчитывается номер недели:
3. Java 8 Date Time API
В этом разделе мы рассмотрим некоторые варианты получения номера недели с даты с помощью этого нового API.
3.1. Получить номер недели, используя числовые значения
Преимущество по сравнению с нашими примерами до Java 8 заключается в том, что у нас нет проблемы с тем, что поле месяца основано на нуле.
3.2. Получить Номер Недели С Помощью Хронополя
В этом последнем примере мы увидим, как использовать перечисление ChronoField , которое реализует Temporal Field interface :
4. Заключение
В этом кратком руководстве мы проиллюстрировали несколько способов получения номера недели с даты с помощью простой Java.
How to determine day of week by passing specific date in Java?
Last modified: March 31, 2020
Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:
1. Overview
In this short tutorial, we’ll see how to extract the day of the week as a number and as text from a Java date.
2. Problem
Business logic often needs the day of the week. Why? For one, working hours and service levels differ between workdays and weekends. Therefore, getting the day as a number is necessary for a lot of systems. But we also may need the day as a text for display.
So, how do we extract the day of the week from dates in Java?
3. Solution With java.util.Date
java.util.Date has been the Java date class since Java 1.0. Code that started with Java version 7 or lower probably uses this class.
3.1. Day of Week as a Number
First, we extract the day as a number using java.util.Calendar:
The resulting number ranges from 1 (Sunday) to 7 (Saturday). Calendar defines constants for this: Calendar.SUNDAY – Calendar.SATURDAY.
3.2. Day of Week as Text
Now we extract the day as text. We pass in a Locale to determine the language:
This returns the full day in your language, such as “Monday” in English or “Montag” in German.
4. Solution With java.time.LocalDate
Java 8 overhauled date and time handling and introduced java.time.LocalDate for dates. Therefore, Java projects that only run on Java versions 8 or higher should use this class!
4.1. Day of Week as a Number
Extracting the day as a number is trivial now:
The resulting number still ranges from 1 to 7. But this time, Monday is 1 and Sunday is 7! The day of the week has its own enum — DayOfWeek. As expected, the enum values are MONDAY – SUNDAY.
4.2. Day of Week as Text
Now we extract the day as text again. We also pass in a Locale:
Just as with java.util.Date, this returns the full day in the chosen language.
5. Conclusion
In this article, we extracted the day of the week from Java dates. We saw how to return both a number and a text using java.util.Date and java.time.LocalDate.
As always, the code is available over on GitHub.