6.1.4. Преобразование разложенного времени в time_t
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
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
28.1. Преобразование идентификатора в имя
28.1. Преобразование идентификатора в имя В результате выполнения команды ls -l для вывода списка содержимого текущего каталога в третьей и четвертой колонках указываются идентификаторы (ID) пользователя и группы, к которой принадлежит каждый файл. Этот список выглядит
Преобразование кодировок
Преобразование кодировок convert_cyr_stringПреобразует строку из одной кодировки кириллицы в другую.Синтаксис:string convert_cyr_string(string str, string from, string to);Функция переводит строку str из кодировки from в кодировку to. Конечно, это имеет смысл только для строк, содержащих "русские" буквы, т.к.
5.3.2. Преобразование AudioCD
5.3.2. Преобразование AudioCD У вас завалялись обычные AudioCD и вы хотите преобразовать их в формат МРЗ? Нет ничего проще. Вставьте AudioCD-диск в устройство и откройте программу Звуковыжималка (команда меню Приложения?Аудио и видео?Копирование звуковых дисков) (рис. 5.19). Puc. 5.19. Окно
1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени
1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени "В ранние мини-компьютерные времена Unix" вынесенная в заголовок идея была довольно радикальной (машины тогда работали
1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени
1.6.13. Правило экономии: время программиста стоит дорого; поэтому экономия его времени более приоритетна по сравнению с экономией машинного времени "В ранние мини-компьютерные времена Unix" вынесенная в заголовок идея была довольно радикальной (машины тогда работали
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Sufrace.В поверхности можно преобразовать следующие объекты:• двумерные фигуры;• области;• разомкнутые полилинии с нулевой
Преобразование в тело
Преобразование в тело Команда CONVTOSOLID преобразует в трехмерные тела полилинии и окружности, для которых задана высота. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Solid.В выдавленные трехмерные тела можно преобразовать следующие объекты:? полилинии с
Преобразование в поверхность
Преобразование в поверхность Команда CONVTOSURFACE преобразует объекты в поверхности. Команда вызывается из падающего меню Modify ? 3D Operations ? Convert to Surface.В поверхности можно преобразовать следующие объекты: двумерные фигуры; области; разомкнутые полилинии с нулевой шириной,
Идентичное преобразование
Идентичное преобразование Наличие в XSLT шаблонов, выполняемых по умолчанию, иногда приводит к тому, что процессоры ведут себя не совсем логично с человеческой точки зрения. Например, в простейшем случае может понадобиться переименовать все элементы с именами bold в
3.2.5 Преобразование типа
3.2.5 Преобразование типа Бывает необходимо явно преобразовать значение одного тпа в значение другого. Явное преобразование типа дает значние одного типа для данного значения другого типа. Например:float r = float(1);перед присваиванием преобразует целое значение 1 к знчению с