5.1. Получение текущей даты и времени
5.1. Получение текущей даты и времени
Проблема
Требуется получить от пользователя компьютера текущую дату и время — либо в формате локального времени, либо в формате универсального глобального времени (Coordinated Universal Time (UTC).
Григорианский календарь и високосные годы
Григорианский календарь — это наиболее широко используемый сегодня в западном мире календарь. Григорианской календарь создавался с целью исправить ошибку в юлианском календаре. Медленный процесс адаптации григорианского календаря начался в 1582 году.
Юлианский календарь говорит, что каждый четвертый год — это високосный год, но каждый сотый год — не високосный. Григорианской календарь ввел еще одно исключение — каждый 400-й год должен быть високосным.
Високосные годы предназначены для компенсации несинхронности вращения Земли вокруг Солнца и продолжительности дня. Другими словами, частное отделения продолжительности солнечного года на длительность дня — это не целое число. В результате если календарь не корректировать, то мы получим смещение сезонов, когда равноденствия и солнцестояния (которые определяют сезоны) будут все более и более рассинхронизированы с каждым новым годом.
Решение
Вызовите функцию time из заголовочного файла <ctime>, передав в качестве параметра значение 0. Результатом будет значение типа time_t. Для преобразования значения time_t в структуру tm, представляющую текущее время UTC (также известное как Greenwich Mean Time (время по Гринвичу), или GMT), используется функция gmtime, а для преобразования значения time_t в структуру tm, представляющую локальное время, используется функция localtime. Программа в примере 5.1 получает текущие дату/время, а затем преобразует их в локальное время и выводит на экран. Затем программа преобразует текущие дату/время во время/дату UTC и также выводит результат на экран.
Пример 5.1. Получение локального времени и времени UTC
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main() {
// Текущие дата/время используемой системы
time_t now = time(0);
// Преобразуем в структуру tm для локальной временной зоны
tm* localtm = localtime(&now);
cout << "Локальные дата и время. " << asctime(localtm) << endl;
// Преобразуем в структуру tm для UTC
tm* gmtm = gmtime(&now);
if (gmtm ! = NULL) {
cout << "Дата и время UTC: " << asctime(gmtm) << endl;
} else {
cerr << "Невозможно получить дату и время UTC" << endl;
return EXIT_FAILURE;
}
}
Обсуждение
Функция time возвращает тип time_t, который является зависящим от реализации арифметическим типом, представляющим временной период (интервал времени) с точностью до одной секунды. Наибольший интервал времени, который можно представить с помощью time_t, сохранив совместимость и переносимость кода, — это 2 147 483 648 секунд, или примерно 68 лет.
Вызов time(0) возвращает time_t, представляющее временной интервал от зависящего от реализации начала отсчета (обычно 0:00:00 1 января 1970 года) до текущего момента.
Ошибка 2038 года
Так как time_t может представлять интервалы времени длиной в 68 лет, а многие реализации для представления текущего времени в качестве начала отсчета используют 1970 год, в большинстве популярных реализаций C++ невозможно представлять даты и времена после 2038 года. Это означает, что если программисты не предпримут мер предосторожности, то в 2038 году большая часть программного обеспечения перестанет работать.
Наиболее удобное представление текущих даты и времени можно получить, преобразовав их с помощью функций localtime или gmtime в структуру tm. Структура tm содержит целочисленные поля, показанные в примере 5.2.
Пример 5.2. Содержимое структуры tm
struct tm {
int tm_sec; // секунды в минуте от 0 до 61 (60 и 61 для секунд координации)
int tm_min; // минуты в часе от 0 до 59
int tm_hour; // часы в сутках от 0 до 23
int tm_mday; // день месяца от 0 до 31
int tm_mon; // месяц года от 0 до 11
int tm_year; // год после 1900
int tm_wday; // дней после воскресенья
int tm_yday; // дней после 1-го января
int tm_isdst; // часы летнего времени
};
При использовании функции gmtime не забудьте проверить ее возвращаемое значение. Если компьютер, на котором выполняется код, не имеет определенной локальной временной зоны (часового пояса), функция gmtime не сможет вычислить время UTC и вернет 0. Если передать 0 в функцию asctime, то результатом будет неопределенное поведение.
Функции localtime, gmtime и asctime возвращают указатели на статически размещенные в памяти объекты. Это более эффективно для библиотеки, не означает, что последующие вызовы будут изменять значение этих объектов. Код в примере 5.3 показывает, как это может привести к неожиданным эффектам.
Пример 5.3. Подводные камни использования asctime
void f() {
char* x = asctime(localtime(time(0)));
wait_for_15_seconds(); // выполняет длительную задачу обработки
asctime(localtime(time(0)));
cout << x << endl; // печатает текущее время, а не то что 15 секунд назад.
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
6.1.3. Форматирование даты и времени
6.1.3. Форматирование даты и времени Примеры в предыдущем разделе показали, как поля в struct tm могли бы быть использованы в качестве индексов символьных строк для вывода информативных значений даты и времени. Хотя можно было бы написать собственный код, использующий такие
18.1. Вывод времени и даты
18.1. Вывод времени и даты 18.1.1. Представление времени В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC[148]. Положительные значения времени относятся к периоду после начала эпохи;
Функции даты и времени
Функции даты и времени checkdateПроверяет правильность даты/времени.Синтаксис:int checkdate(int month, int day, int year);Функция checkdate() проверяет правильность даты, заданной в ее аргументах.Возвращает true если дата, указанная как "month, day, year" (месяц, число, год), правильна, иначе false. Дата считается
Пример: клиент времени и даты
Пример: клиент времени и даты В листинге 11.5 показан наш клиент времени и даты из листинга 1.1, переписанный с использованием функции tcp_connect.Листинг 11.5. Клиент времени и даты, переписанный с использованием функции tcp_connect//names/daytimetcpcli.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int
Пример: сервер времени и даты
Пример: сервер времени и даты В листинге 11.7 показан наш сервер времени и даты из листинга 4.2, переписанный с использованием функции tcp_listen.Листинг 11.7. Сервер времени и даты, переписанный с использованием функции tcp_listen//names/daytimetcpsrv1.c 1 #include "unp.h" 2 #include <time.h> 3 int 4 main(int argc, char
Настройка системной даты и времени
Настройка системной даты и времени Информация о текущей системной дате и времени по умолчанию отображается в правом нижнем углу интерфейса, в области уведомлений панели задач. Вы можете самостоятельно настроить режим ее отображения, и о том, как это делать, мы расскажем
7.10. Контроль даты и времени
7.10. Контроль даты и времени В разделе 7.5 было показано, что стандартные функции не проверяют корректность даты, а «переносят» ее вперед, если необходимо. Например, 31 ноября становится 1 декабря.Иногда такое поведение даже желательно. А если нет, то спешу обрадовать:
7.20. Извлечение даты и времени из строки
7.20. Извлечение даты и времени из строки Дата и время могут быть представлены в виде строки самыми разными способами: в полной или сокращенной форме, с разной пунктуацией, различным порядком компонентов и т.д. Из-за такого разнообразия очень сложно написать код,
7.21. Форматирование и печать даты и времени
7.21. Форматирование и печать даты и времени Для получения канонического представления даты и времени служит метод asctime; У него есть синоним ctime.Аналогичный результат дает метод to_s. Точно такая же строка будет напечатана, если просто передать объект, представляющий дату и
3.4. Функции даты и времени
3.4. Функции даты и времени В данном разделе мы рассмотрим некоторые полезные функции, выполняющие различные операции с датами: получение текущей даты и/или времени, получение отдельных компонентов даты и/или времени, арифметические операции с датами (сложение, вычитание)
Средства для форматирования даты и времени
Средства для форматирования даты и времени В первых версиях XSLT элемент xsl:decimal-format и функция format-number обеспечивали форматирование чисел при их текстовом отображении. К сожалению, подобных инструментов для форматирования даты предусмотрено не было.Поскольку связка
Настройка даты и времени
Настройка даты и времени Переходим к настройке даты и времени. Пожалуй, эта операция одна из самых простых среди изменений параметров работы Windows. Произвести ее можно, выбрав значок Дата и время из подраздела Дата, время, язык и региональные настройки на Панели управления.
Настройка даты и времени
Настройка даты и времени Для настройки даты и времени щелкните правой кнопкой мыши на значке часов в области уведомлений и выберите пункт Настройка даты/времени. Чтобы изменить показания часов или текущую дату, вам понадобятся полномочия администратора компьютера.
Автоматический ввод текущей даты и времени
Автоматический ввод текущей даты и времени При вводе данных в таблицу Заказы неудобно каждый раз вводить текущие дату и время в поле ДатаЗаказа. Для настройки автоматического ввода текущего времени выполните следующие действия.1. Снова откройте таблицу Заказы в режиме