16. Java — Дата и время
Java предоставляет класс Date, который доступен в пакете java.util, этот класс заключает в себе текущую дату и время.
Содержание
Конструкторы
Класс Date поддерживает два конструктора, которые показаны ниже.
| № | Конструктор и описание |
| 1 | Date() Этот конструктор инициализирует объект с текущей датой и временем. |
| 2 | Date(long millisec) Этот конструктор принимает аргумент равный числу миллисекунд, истекших с полуночи 1 января 1970 г. |
Методы класса Date
Ниже представлены методы класса Date.
| № | Методы с описанием |
| 1 | boolean after(Date date) Возвращает значение true, если вызывающий объект date содержит дату, которая раньше заданной даты, в противном случае он возвращает значение false. |
| 2 | boolean before(Date date) Возвращает значение true, если вызывающий объект date содержит дату, более раннюю, чем заданная дата, в противном случае он возвращает значение false. |
| 3 | Object clone() Дублирование вызывающего объекта date. |
| 4 | int compareTo(Date date) Сравнивает значение вызывающего объекта с этой датой. Возвращает 0, если значения равны. Возвращает отрицательное значение, если объект вызова является более ранним, чем дата. Возвращает положительное значение, если объект вызова позже даты. |
| 5 | int compareTo(Object obj) Работает точно так же compareTo(Date), если объект вызова имеет класс Date. В противном случае вызывает ClassCastException. |
| 6 | boolean equals(Object date) Возвращает значение true, если вызывающий объект date содержит то же время и дату, которая указана в date, в противном случае он возвращает значение false. |
| 7 | long getTime() Возвращает количество миллисекунд, истекших с 1 января 1970 года. |
| 8 | int hashCode() Возвращает хэш-код для вызывающего объекта. |
| 9 | void setTime(long time) Задает дату и время, соответствующие моменту времени, что представляет собой общее затраченное время в миллисекундах от полуночи 1 января 1970 года. |
| 10 | String toString() Преобразует вызывающий объект date в строку и возвращает результат. |
Текущая дата и время в Java
Получить текущую дату и время в Java достаточно не трудно. Вы можете использовать простой объект date вместе с методом toString(), чтобы вывести текущую дату и время следующим образом:
Получим следующий результат:
Сравнение дат
Существуют три способа в Java сравнить даты:
- Можно использовать функцию getTime(), чтобы получить количество миллисекунд, прошедших с момента полуночи 1 января 1970, для обоих объектов, а затем сравнить эти два значения.
- Вы можете использовать методы before(), after() и equals(). Поскольку 12 число месяца раньше 18 числа, например, new Date(99, 2, 12).before(new Date (99, 2, 18)) возвращает значение true.
- Можно использовать метод compareTo(), который определяется сопоставимым интерфейсом и реализуется по дате.
Форматирование даты с помощью SimpleDateFormat
SimpleDateFormat — это конкретный класс для парсинга и форматирования даты в Java. SimpleDateFormat позволяет начать с выбора любых пользовательских шаблонов для форматирования даты и времени. Например:
Получим следующий результат:
Формат-коды SimpleDateFormat
Для того, чтобы задать в Java формат даты и времени, используйте строковый шаблон (регулярные выражения) с датой и временем. В этой модели все буквы ASCII зарезервированы как шаблон письма, которые определяются следующим образом:
Форматирование даты с помощью printf
Формат даты и времени можно сделать без труда с помощью метода printf. Вы используете формат двух букв, начиная с t и заканчивая одним из символов в таблице, приведенных ниже. Например:
Получим следующий результат:
Было бы немного глупо, если Вы должны были бы поставить дату несколько раз для форматирования каждой части. По этой причине формат строки может указывать индекс аргумента для форматирования.
C ++ — Дата и время
Стандартная библиотека C ++ не предоставляет правильный тип даты. C ++ наследует структуры и функции для обработки дат и времени из C. Чтобы получить доступ к функциям и структурам, связанным с датой и временем, вам нужно будет включить заголовочный файл <ctime> в вашей программе на C ++.
Существует четыре типа времени: clock_t, time_t, size_t и tm . Типы — clock_t, size_t и time_t могут представлять системное время и дату как некоторое целое число.
Тип структуры tm содержит дату и время в виде структуры C, имеющей следующие элементы:
Ниже приведены важные функции, которые мы используем при работе с датой и временем на C или C ++. Все эти функции являются частью стандартной библиотеки C и C ++, и вы можете проверить их детали, используя ссылку на стандартную библиотеку C ++, приведенную ниже.
| time_t time (time_t * time); | Это возвращает текущее время календаря системы в количестве секунд, прошедших с 1 января 1970 года. Если система не имеет времени, возвращается .1. |
| char * ctime (const time_t * time); | Это возвращает указатель на строку формы день месяц год: минуты: секунды год \ n \ 0 . |
| struct tm * localtime (const time_t * time); | Это возвращает указатель на структуру tm, представляющую локальное время. |
| clock_t clock (void); | Это возвращает значение, которое приблизительно соответствует времени, в течение которого вызываемая программа была запущена. Значение, равное .1, возвращается, если время недоступно. |
| char * asctime (const struct tm * time); | Это возвращает указатель на строку, содержащую информацию, хранящуюся в структуре, на которую указывает время, преобразованное в форму: day month date hours: minutes: seconds year \ n \ 0 |
| struct tm * gmtime (const time_t * time); | Это возвращает указатель на время в виде структуры tm. Время представлено в скоординированном универсальном времени (UTC), которое по сути является средним временем по Гринвичу (GMT). |
| time_t mktime (struct tm * time); | Это возвращает эквивалент календарного времени времени, найденного в структуре, на которую указывает время. |
| double difftime (time_t time2, time_t time1); | Эта функция вычисляет разницу в секундах между временем 1 и временем 2. |
| size_t strftime (); | Эта функция может использоваться для форматирования даты и времени в определенном формате. |
Текущая дата и время
Предположим, вы хотите получить текущую системную дату и время, либо в качестве локального времени, либо в качестве скоординированного универсального времени (UTC). Ниже приведен пример для достижения того же:
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Формат времени с использованием struct tm
Структура tm очень важна при работе с датой и временем на C или C ++. Эта структура содержит дату и время в виде структуры C, как указано выше. Большинство функций, связанных со временем, используют структуру tm. Ниже приведен пример, который использует различные функции, связанные с датой и временем, и структуру tm —
При использовании структуры в этой главе я исхожу из предположения, что у вас есть базовое понимание структуры C и как получить доступ к членам структуры с помощью оператора arrow -> .
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Функции работы с датой и временем
Для работы с системной датой и временем используется библиотека time.h .
Типы, определенные в библиотеке time.h
| Тип | Описание |
| size_t | Целочисленный тип, возвращаемый операцией sizeof . |
| clock_t | Арифметический тип, подходящий для представления времени. |
| time_t | Арифметический тип, подходящий для представления времени. |
| struct tm | Структурный тип, содержащий компоненты календарного времени. |
Для определения текущего календарного времени используется функция
Данная функция возвращает время в секундах начиная с 1 января 1970 г.

Структура tm имеет вид
преобразует календарное время, указанное ptm , сохраняет его в структуре tm и возвращает указатель на нее.
осуществляет обратное преобразование.
Если время не доступно или не может быть представлено, возвращает (clock_t) (-1) .
копирует строку fmt в строку s , заменяя спецификаторы формата в fmt соответствующими данными, взятыми из содержимого структуры времени, на которое указывает tmpt ; в строку s помещается не более max символов.
Функция возвращает количество символов (исключая нулевой) в результирующей строке. Если результирующая строка (включая нулевой символ) содержит больше, чем max символов, функция возвращает 0, а содержимое s не определено.
| Спец. | Назначение |
| %a | Локальное сокращенное название дня недели |
| %A | Локальное полное название дня недели |
| %b | Локальное сокращенное название месяца |
| %B | Локальное полное название месяца |
| %c | Локальный разделитель даты и времени |
| %d | День месяца в виде десятичного числа (01-31) |
| %D | Эквивалент %m%d%y |
| %e | День месяца (десятичное число): однозначные числа дополнены пробелом |
| %F | Эквивалент %Y-%m-%d |
| %g | Последние два разряда года (00-99) |
| %G | Год в виде десятичного числа |
| %H | Часы (по 24-часовой шкале) в виде десятичного числа (00-23) |
| %I | Часы (по 12-часовой шкале) в виде десятичного числа (01-12) |
| %j | День года в виде десятичного числа (001-366) |
| %m | Месяц в виде десятичного числа (01-12) |
| %n | Символ новой строки |
| %M | Минуты в виде десятичного числа (00-59) |
| %p | Локальный эквивалент a.m./p.m. для 12-часовой временной шкалы |
| %r | Локальное 12-часовое время |
| %R | Эквивалент %H:%M |
| %S | Секунды в виде десятичного числа (00-61) |
| %t | Символ горизонтальной табуляции |
| %T | Эквивалент %H:%M:%S |
| %u | Номер дня недели (1-7), где 1 соответствует понедельнику |
| %U | Номер недели в году, считая воскресенье первым днем недели (00-53) |
| %w | Номер дня недели в виде десятичного числа, начиная с воскресенья (0-6) |
| %W | Номер недели в году, считая понедельник первым днем недели (00-53) |
| %y | Год без века в виде десятичного числа (00-99) |
| %Y | Год с веком в виде десятичного числа |
| %z | Смещение от UTC ("-800" означает на 8 ч по Гринвичу западнее). |
| %Z | Наименование часового пояса (если доступно) |
| %% | % (то есть знак процента). |
Функция, позволяющая вывести день недели на русском языке
Результат выполнения
Добавление нескольких дней к текущему времени
Рассмотрим еще один пример. Допустим, требуется добавить несколько дней к текущей дате.
Реализация на Си
Результат выполнения 
Реализация функции задержки
Результат выполнения 
Комментариев к записи: 17
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#define ADD_DAYS 300
#define BUFF_SIZE 40
timer = time( NULL );
u = localtime(&timer);
strftime(s1, BUFF_SIZE, "%Y.%m.%d %H:%M:%S " , u);
u->tm_mday += ADD_DAYS;
next = mktime(u);
u = localtime(&next);
strftime(s2, BUFF_SIZE, "%Y.%m.%d %H:%M:%S " , u);