Тип time_t
представляет Unix time , количество секунд с четверга, 1 января 1970 года, 00:00:00 UTC, минус високосные секунды.
(Интерфейс POSIX clock_gettime()
может расширить поддержку для CLOCK_TAI
, что будет то же самое, за исключением , включая високосных секунд.)
Для манипуляции датами , лучше использовать стандартное время разбивки C, struct tm
, как предусмотрено в localtime()
или gmtime()
.
localtime()
использует текущий часовой пояс. (В системах Linux часовой пояс по умолчанию установлен в /etc/timezone
, но каждый пользователь может переопределить его, установив переменную окружения TZ
. Подробнее о том, как это сделать, см. Функцию tzset()
POSIX.1]. ) gmtime()
использует UTC.
«Уловка» заключается в том, что если вы вызовете mktime()
для struct tm
, описывающего дату и время в текущем часовом поясе, он сначала нормализует поля, а затем возвращает время Unix как time_t
, соответствующее этой дате и местному времени. Например, если день месяца равен 45, он будет корректировать день, месяц и год (и соответствующие поля) для отражения фактической даты.
Итак, если вы хотите узнать дату и время через пять дней и шесть часов:
time_t now, then;
struct tm *t;
now = time(NULL);
t = localtime(&now);
printf("Now is %llu = %04d-%02d-%02d %02d:%02d%02d\n",
(unsigned long long)now,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
t->tm_hour += 6;
t->tm_mday += 5;
t->tm_isdst = -1; /* Don't know if DST or not; please guess. */
then = mktime(t);
printf("Then is %llu = %04d-%02d-%02d %02d:%02d:%02d\n",
(unsigned long long)then,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
Если мы опускаем печать значений now
и then
, вышеприведенное совершенно стандартный код C и будет работать на всех современных операционных системах.
Если вы используете Linux или другую систему POSIXy (Mac, BSD), было бы лучше использовать
time_t now, then;
struct tm tbuffer, *t;
now = time(NULL);
t = localtime_r(&now, &tbuffer);
printf("Now is %llu = %04d-%02d-%02d %02d:%02d%02d\n",
(unsigned long long)now,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
t->tm_hour += 6;
t->tm_mday += 5;
t->tm_isdst = -1; /* Don't know if DST or not; please guess. */
then = mktime(t);
printf("Then is %llu = %04d-%02d-%02d %02d:%02d:%02d\n",
(unsigned long long)then,
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
Разница в том, что localtime()
возвращает указатель на статически распределенный буфер, а другой обращение к нему (даже в другом потоке) перезапишет содержимое. POSIX.1 localtime_r()
принимает второй параметр, указатель на struct tm
, где вместо этого сохраняется результат.
Зеркальное отображение
Доставка журналов
В целях резервирования я рекомендовал бы Зеркально отразить: это сохраняет всегда актуальную копию Вашей базы данных без преград.. Если Вам не нужна автоматическая обработка отказа, Вам нужны всего два сервера/экземпляра. Обратите внимание, что режим High Performance только доступен в Enterprice (SP) выпуск!
Переключение на вторичную базу данных действительно занимает больше времени с передачей журналов, но это не слишком плохо. Необходимо будет вручную скопировать любые нескопированные файлы резервных копий, применить резервные копирования журнала транзакций во вторичную базу данных, восстановить вторичную базу данных и изменить ее роль на основное устройство. Если старые основные доступные базы данных, необходимо создать резервную копию его журнала транзакций перед началом. Обработка отказа с зеркальным отражением несколько более проста, и может быть сделана автоматически при использовании режима High Availability. Даже когда с помощью режима High Performance, это - все еще одна операция оператора.