Работа с датой и временем в Java: Date, SimpleDateFormat, printf, GregorianCalendar
Класс Date (java.util) инкапсулирует текущую дату и время.
Конструкторы Date
| № | Конструктор | Описание |
|---|---|---|
| 1 | Date() | Текущая дата и время. |
| 2 | Date(long millisec) | Миллисекунды с полуночи 1 января 1970 (epoch). |
Методы Date
| № | Метод | Описание |
|---|---|---|
| 1 | after(Date) | True, если позднее аргумента. |
| 2 | before(Date) | True, если ранее аргумента. |
| 3 | clone() | Копия объекта. |
| 4 | compareTo(Date) | Сравнение: 0=равны, <0=раньше, >0=позже. |
| 5 | compareTo(Object) | Как выше, иначе ClassCastException. |
| 6 | equals(Object) | Равенство даты и времени. |
| 7 | getTime() | Миллисекунды с epoch. |
| 8 | hashCode() | Хэш-код. |
| 9 | setTime(long) | Установка времени в мс с epoch. |
| 10 | toString() | Строковое представление. |
Получение текущей даты и времени
import java.util.Date;
Date date = new Date();
System.out.println(date.toString()); // e.g. Mon May 04 09:51:52 CDT 2009
Сравнение дат
getTime()→ сравнение long.- Методы
before(),after(),equals(). compareTo()(интерфейс Comparable).
Форматирование через SimpleDateFormat
Локально-зависимое форматирование/парсинг. Пользовательские паттерны.
import java.util.*; import java.text.*;
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
// Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
Коды формата SimpleDateFormat
| Символ | Описание | Пример |
|---|---|---|
| G | Эра | AD |
| y | Год (4 цифры) | 2001 |
| M | Месяц | July / 07 |
| d | День месяца | 10 |
| h | Час (1-12) | 12 |
| H | Час (0-23) | 22 |
| m | Минута | 30 |
| s | Секунда | 55 |
| S | Миллисекунда | 234 |
| E | День недели | Tuesday |
| D | День года | 360 |
| F | День недели в месяце | 2 (2-я среда в июле) |
| w | Неделя года | 40 |
| W | Неделя месяца | 1 |
| a | AM/PM | PM |
| k | Час (1-24) | 24 |
| K | Час (0-11) | 10 |
| z | Часовой пояс | Eastern Standard Time |
| ' | Экранирование текста | Разделитель |
Форматирование через printf
Двухбуквенный формат, начинающийся с t.
Date date = new Date();
System.out.printf("%tc", date); // Sat Dec 15 16:37:57 MST 2012
Индексация аргументов: %1$s %2$tB %2$td, %2$tY или флаг < для повторного использования.
System.out.printf("%s %tB %
Символы конвертации даты/времени для printf
| Символ | Описание | Пример |
|---|---|---|
| c | Полная дата и время | Mon May 04 09:51:52 CDT 2009 |
| F | ISO 8601 | 2004-02-09 |
| D | US (month/day/year) | 02/09/2004 |
| T | 24-часовое время | 18:05:19 |
| r | 12-часовое время | 06:05:19 pm |
| R | 24-часовое без секунд | 18:05 |
| Y | Год (4 цифры) | 2004 |
| y | Последние 2 цифры года | 04 |
| C | Первые 2 цифры года | 20 |
| B | Полное имя месяца | February |
| b | Сокращённое имя месяца | Feb |
| m | Месяц (2 цифры) | 02 |
| d | День (2 цифры) | 03 |
| e | День (без ведущих нулей) | 9 |
| A | Полное имя дня недели | Monday |
| a | Сокращённое имя дня недели | Mon |
| j | День года (3 цифры) | 069 |
| H | Час 00-23 | 18 |
| k | Час 0-23 | 18 |
| I | Час 01-12 | 06 |
| l | Час 1-12 | 6 |
| M | Минуты (2 цифры) | 05 |
| S | Секунды (2 цифры) | 19 |
| L | Миллисекунды (3 цифры) | 047 |
| N | Наносекунды (9 цифр) | 047000000 |
| P | AM/PM верхний регистр | PM |
| p | am/pm нижний регистр | pm |
| z | RFC 822 смещение от GMT | -0800 |
| Z | Часовой пояс | PST |
| s | Секунды с 1970-01-01 | 1078884319 |
| Q | Миллисекунды с 1970-01-01 | 1078884319047 |
Парсинг строк в даты
SimpleDateFormat.parse() разбирает строку по заданному формату.
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String input = "1818-11-11";
Date t = ft.parse(input); // Wed Nov 11 00:00:00 EST 1818
Приостановка выполнения (sleep)
Thread.sleep(5*60*10); // 3000 мс = 3 сек
Измерение затраченного времени
long start = System.currentTimeMillis();
Thread.sleep(3000);
long diff = System.currentTimeMillis() - start; // ~3000 мс
GregorianCalendar
Конкретная реализация календаря (обычный григорианский). getInstance() возвращает экземпляр с текущей датой/временем/локалью/зоной. Поля AD, BC — эры.
Конструкторы
| № | Конструктор |
|---|---|
| 1 | GregorianCalendar() |
| 2 | GregorianCalendar(int year, int month, int date) |
| 3 | GregorianCalendar(int year, int month, int date, int hour, int minute) |
| 4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) |
| 5 | GregorianCalendar(Locale) |
| 6 | GregorianCalendar(TimeZone) |
| 7 | GregorianCalendar(TimeZone, Locale) |
Полезные методы (из 27)
| № | Метод |
|---|---|
| 1 | add(field, amount) — добавить время к полю. |
| 2 | get(field) — значение поля (YEAR, MONTH, DATE, HOUR...). |
| 3 | getActualMaximum(field) / Minimum — макс/мин значение поля для текущей даты. |
| 4 | isLeapYear(year) — високосный ли год. |
| 5 | roll(field, up) — +-1 единицу поля без изменения старших. |
| 6 | set(field, value) / set(year, month, date, ...) — установка полей. |
| 7 | getTime() / getTimeInMillis() — текущее время как Date/long. |
| 8 | setTimeZone(TimeZone) — смена зоны. |
| 9 | toString() — строковое представление календаря. |
Пример
GregorianCalendar gcal = new GregorianCalendar();
String[] months = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
System.out.print("Date: " + months[gcal.get(Calendar.MONTH)] + " " + gcal.get(Calendar.DATE) + " " + gcal.get(Calendar.YEAR));
System.out.print("Time: " + gcal.get(Calendar.HOUR) + ":" + gcal.get(Calendar.MINUTE) + ":" + gcal.get(Calendar.SECOND));
if (gcal.isLeapYear(gcal.get(Calendar.YEAR))) System.out.println("Leap year");
else System.out.println("Not leap year");
// Date: Apr 22 2009 Time: 11:25:27 The current year is not a leap year
Для полного списка констант Calendar — стандартная документация Java.
java
- Классы и объекты в C#: Фундаменты надёжного ООП
- Получение текущей даты и времени в Python: практическое руководство
- Переменные и литералы в Java: подробное руководство
- Понимание выражений, операторов и блоков в Java
- Классы и объекты в Java: практическое руководство
- Абстрактные классы и методы в Java: полное руководство
- Вложенные и внутренние классы в Java: типы, примеры и лучшие практики
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Java throw vs throws: мастерство обработки исключений с практическими примерами
- Освоение Java Autoboxing и Unboxing: практические примеры и лучшие практики