Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

ЗАМЕЧАНИЕ. Некоторые форматы данных более полезны, чем другие. Например, 12-часовое время двусмысленно, также, как чисто числовые форматы дат. (Что означает '

9/11
'? Это зависит от того, где вы живете) Сходным образом, годы из двух цифр также являются плохой мыслью. Используйте
strftime
благоразумно

6.1.4. Преобразование разложенного времени в

time_t

Получение от системы значений «секунд с начала Эпохи» просто; именно так даты и времена хранятся в индексах и возвращаются с помощью

time
и
stat
. Эти значения также легко оценивать на равенство или посредством < и > для простых тестов раньше/позже.

Однако, с датами, введенными людьми, не так легко работать. Например, многие версии команды

touch
позволяют предусмотреть дату и время, в которое
touch
должна установить время модификации или доступа к файлу (с помощью
utime
, как было описано в разделе 5.5.3 «Изменение отметок времени:
utime
»).

Преобразование даты, введенной человеком, в значение

time_t
трудно: надо принять во внимание високосные годы, учесть часовые пояса и т.д. Поэтому стандарт C89 ввел функцию
mktime
:

#include <time.h> /* ISO С */

time_t mktime(struct tm *tm);

Для использования

mktime
укажите в
struct tm
соответствующие значения — год, месяц, день и т.д. Если вы знаете, действовало ли для данной даты летнее время, установите соответствующим образом поле
tm_isdst
: 0 для «нет» и положительное значение для «да». В противном случае, используйте отрицательное значение для «не знаю». Поля
tm_wday
и
tm_yday
игнорируются.

mktime
предполагает, что
struct tm
представляет локальное время, не UTC. Она возвращает значение
time_t
, представляющее переданные дату и время, или
(time_t)(-1)
, если данные дата/время не могут быть правильно представлены. После успешного возвращения все значения
struct tm
выверены на попадание в правильные диапазоны, a
tm_wday
и
tm_yday
также корректно установлены. Вот простой пример:

1 /* ch06-echodate.c --- демонстрирует mktime. */

2

3 #include <stdio.h>

4 #include <time.h>

5

6 int main(void)

7 {

8 struct tm tm;

9 time_t then;

10

11 printf("Enter a Date/time as YYYY/MM/DD HH:MM:SS : ");

12 scanf("%d/%d/%d %d:%d:%d",

13 &tm.tm_year, &tm.tm_mon, &tm.tm_mday,

14 &tm.tm_hour, &tm.tm_min, &tm.tm_sec);

15

16 /* Проверка ошибок значений для краткости опущена. */

17 tm.tm_year -= 1900;

18 tm.tm_mon--;

19

20 tm.tm_isdst = -1; /* He знаю о летнем времени */

21

22 then = mktime(&tm);

23

24 printf("Got: %s", ctime(&then));

25 exit(0);

26 }

В строке 11 запрашиваются дата и время, а в строках 12–14 соответствующие значения считываются. (В коде изделия возвращаемые

scanf
значения должны проверяться.) Строки 17 и 18 компенсируют различную базу для лет и месяцев соответственно. Строка 20 указывает, что мы не знаем, представляют ли данные дата и время летнее время. Строка 22 вызывает
mktime
, а строка 24 выводит результат преобразования. После компилирования и запуска мы видим, что это работает:

$ ch06-echodate

Enter a Date/time as YYYY/MM/DD HH:MM:SS : 2003/5/25 19:07:23

Got: Sun May 25 19:07:23 2003

6.1.5. Получение сведений о часовом поясе

На ранних системах Unix сведения о часовом поясе внедрялись в ядро при компиляции. Правила перехода на летнее время обычно были жестко вшиты в код, что создавало трудности для пользователей вне Соединенных Штатов или в местах внутри Соединенных Штатов, в которых не осуществлялся переход на летнее время.

В современных системах эти сведения выделены в двоичные файлы, которые читаются библиотекой С при извлечении функций, связанных со временем. Эта методика позволяет избежать необходимости в перекомпилировании библиотек и системных файлов при изменении правил и гораздо упрощает обновление правил.

Интерфейс языка С для сведений о часовых поясах развивался в разных версиях Unix, как на System V, так и Berkley, пока, наконец, не был стандартизован POSIX следующим образом.

#include <time.h> /* POSIX */

extern char *tzname[2];

extern long timezone;

extern int daylight;

void tzset(void);

Функция

tzset
проверяет переменную окружения
TZ
для получения сведений о часовом поясе и переходе на летнее время. [65] Если эта переменная не установлена,
tzset
использует «определенный в реализации часовой пояс по умолчанию», который скорее всего является часовым поясом машины, на которой вы работаете.

65

Хотя POSIX стандартизует формат TZ, он не представляет интереса, поэтому мы не стали возиться здесь с его документированием. В конце концов, именно

tzset
должна понимать формат, а не код пользователя. Реализации могут использовать и используют форматы, которые расширяют POSIX — Примеч. автора.

Поделиться:
Популярные книги

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Древесный маг Орловского княжества 4

Павлов Игорь Васильевич
4. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 4

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Афганский рубеж 4

Дорин Михаил
4. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 4

Третий Генерал: Том III

Зот Бакалавр
2. Третий Генерал
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Третий Генерал: Том III

Бастард Императора. Том 15

Орлов Андрей Юрьевич
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 15

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Младший сын

Балашов Дмитрий Михайлович
1. Государи московские
Научно-образовательная:
история
8.50
рейтинг книги
Младший сын

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

Князь Целитель 2

Ткачев Андрей Юрьевич
2. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 2

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Analyste

Мелехов Андрей Михайлович
Аналитик
Фантастика:
социально-философская фантастика
юмористическая фантастика
6.57
рейтинг книги
Analyste