|
time.h ARMCC |
|
|
|
Dec 5 2016, 06:49
|
Частый гость
 
Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159

|
Здравствуйте! Как учитывается временная зона в стандартной библиотеке времени time.h? Все что нашел в файле time.h - упоминание в функции strftime() Цитата %Z is replaced by the timezone name or abbreviation, or by no characters if no time zone is determinable. Попробовал все, что можно вывести, выводит все, кроме временной зоны: Цитата time_t rawtime = 1480685759; // Fri, 02 Dec 2016 13:35:59 GMT struct tm * timeinfo; timeinfo = (struct tm*)localtime(&rawtime); // Convert time_t to tm as UTC time char buffer [80];
strftime (buffer,80,"%I:%M%p",timeinfo); puts (buffer); // 01:35PM
strftime (buffer,80,"%H:%M:%S%p",timeinfo); puts (buffer); // 13:35:59PM
strftime (buffer,80,"%H:%M:%S",timeinfo); puts (buffer); // 13:35:59
strftime (buffer,80,"%d.%m.%y",timeinfo); puts (buffer); // 02.12.16
strftime (buffer,80,"%a_%A",timeinfo); puts (buffer); // Fri_Friday
strftime (buffer,80,"%b_%B",timeinfo); puts (buffer); // Dec_December
strftime (buffer,80,"%c",timeinfo); puts (buffer); // 02 Dec 2016 13:35:59
strftime (buffer,80,"%j",timeinfo); puts (buffer); // 337 (day of the year as a decimal number (001-366))
strftime (buffer,80,"%W",timeinfo); puts (buffer); // 48 (the week number of the year (Monday as the first day))
strftime (buffer,80,"%x",timeinfo); puts (buffer); // 02 Dec 2016
strftime (buffer,80,"%X",timeinfo); puts (buffer); // 13:35:59
strftime (buffer,80,"%y",timeinfo); puts (buffer); // 16 (year without century).
strftime (buffer,80,"%Y",timeinfo); puts (buffer); // 2016 (year with century)
strftime (buffer,80,"%Z",timeinfo); puts (buffer); // ??? Не знаю, как её задавать. Ведь с систем синхронизации будет время UTC+0, а у меня локальное UTC+3. Т.е. где-то должна быть временная зона. Посмотрел у других - для PIC24 (компилятор XC16) в файле time.h есть переменная time_zone: Код extern int time_zone; /* minutes WESTWARD of Greenwich */ /* this value defaults to 0 since with operating systems like MS-DOS there is no time zone information available */
Сообщение отредактировал Pridnya - Dec 5 2016, 06:52
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 24)
|
Jan 23 2017, 19:52
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
jcxz, спасибо! тоже думаю про похожее, так как хороших вариантов не так уж много. Интересный вопрос- конфигуратор, в какой форме-формате задавать величины как задать так чтобы покрыть все хотелки, не тупик в развитии, и при этом чтоб простой парсинг был. Разглядывал как переменная TZ сделана, это кажется самый универсальный путь. Там два варианта стандартизировано, через день года(абсолютная дата) и через недели (для тривиальных ситуаций). Вкусность в том что это уже документировано, а не новый велосипед. Осталось выделить нужную часть для использования в конфигураторе, чтобы все не делать. Думаю для начала только кусок с " day d of week w of month m" реализовать, потом разовью если нужно будет. То есть для примера ниже все уже задокументировано, и не велосипед. Может, и исходники tzset() пригодятся  Цитата Here are some example TZ values, including the appropriate Daylight Saving Time and its dates of applicability. In North American Eastern Standard Time (EST) and Eastern Daylight Time (EDT), the normal offset from UTC is 5 hours; since this is west of the prime meridian, the sign is positive. Summer time begins on March’s second Sunday at 2:00am, and ends on November’s first Sunday at 2:00am.
EST+5EDT,M3.2.0/2,M11.1.0/2
Here is an example for New Zealand, where the standard time (NZST) is hours ahead of UTC, and daylight saving time (NZDT), 13 hours ahead of UTC, runs from the first Sunday in October to the third in March, and the changeovers happen at the default time of 02:00:00:
TZ="NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0" Про часы и время- у меня тоже время всегда в UTC, коррекция на таймзону только в команду чтения локального времени вставлена. Теперь буду там же еще и зиму-лето вставлять. Лично я хорошо понимаю насколько это проблематично, особенно если неразрывность данных нужна и возможна передача в другие системы. Но для локального использования может быть и неплохо иногда.
|
|
|
|
|
Jan 24 2017, 10:44
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Ruslan1 @ Jan 23 2017, 20:30)  Ну хорошо, врукопашную. А кто как даты перевода задает? я как-то думал, что можно еще и дефолт сделать(последняя суббота марта...), но, разброд и шатание не поддаются алгоритмизации, понял, что лучше всегда требовать точно задать дату и время перевода, потому как дефолт-понятие растяжимое и у каждого он свой. Ну я так и задаю. У меня 407 проц. Я календарь веду. То есть я контролирую дни недели. И перехожу (если опция включена) на летнее/ зимнее время согласно принятому. времени перехода. Осуществляется это в диагностической задаче у меня. Сам переход выполняет проц аппаратно, но там тоже надо танцы с бубном делать. То есть в нужный момент включить признак, а потом выключить. Сам проц не переходит. У меня это контролируется в ТУ, поэтому проверяется на приёмочных и периодических испытаниях. В старом приборе записывались даты и время перехода таблично... )) Прикололся. )) Всё равно календарь веду, так я его вывожу одним из меню
|
|
|
|
|
Jan 24 2017, 12:13
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(jcxz @ Jan 23 2017, 20:00)  По памяти: у нас были следующие варианты задания в конфиге диапазона летнего времени: 1.Фиксированное число/месяц. 2.Последняя суббота N-го месяца. 3.Первая суббота N-го месяца (хотя уже не помню - возможно можно было выбрать номер субботы определённого месяца). Всё учитывали. И перевод может быть на не целое число часов (полчаса например). Добавлю, тоже по памяти, там еще был флажок полушария: северное или южное. Цитата(Ruslan1 @ Jan 23 2017, 21:52)  Интересный вопрос- конфигуратор, в какой форме-формате задавать величины как задать так чтобы покрыть все хотелки, не тупик в развитии, и при этом чтоб простой парсинг был. Я конфигуратор вставлял в стандартном формате, только миллисекунды перевел в секунды. Ну и пренебрег случаем, когда все переводы вставляются для каждого года индивидуально ради экономии. А парсинг там совершенно простой для любого случая - просто взял соответствующий копи-паст из линукса.
Сообщение отредактировал aiwa - Jan 24 2017, 12:14
|
|
|
|
|
Jan 24 2017, 12:20
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(aiwa @ Jan 24 2017, 14:03)  Добавлю, тоже по памяти, там еще был флажок полушария: северное или южное. мне кажется, что это лишняя сущность. И что указать в экваториальных странах, которые и в том и в этом? (Свят-свят! не хотел бы я там что-нить ставить  ) Для вычисления достаточно просто честно проверять даты начала и конца указанной зоны при условии что событие не чаще раза в год, а не смотреть на начало-конец года. в-общем, проникся я как tzset() работает, красиво. В будущем- нужно просто переменную TZ честно поддерживать, к чему и буду стремиться. Не нужно в этой области велосипедов, все уже придумано до для нас. Но сейчас сделаю еще более простую реализацию, чтоб не менять уже давно написанное в данном проекте.
|
|
|
|
|
Jan 24 2017, 12:26
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Ruslan1 @ Jan 24 2017, 14:20)  мне кажется, что это лишняя сущность.
Для вычисления достаточно просто честно проверять даты начала и конца указанной зоны при условии что событие не чаще раза в год, а не смотреть на начало-конец года. Как раз этот флажок и нужен для проверки начала и конца указанной зоны, а точнее, его участие заключается в том что он для южного полушария всего лишь меняет местами начало и конец DLT-зоны. Может и не нужен, но используется в виде оператора if лишь один раз в год при построении границ зимнего времени.
|
|
|
|
|
Jan 24 2017, 13:37
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(jcxz @ Jan 24 2017, 15:04)  Не помню флажка. А Вы разве в нашем проекте участвовали??? И Вас в нашем проекте тоже не помню  Наверное в качестве флажка.
|
|
|
|
|
Jan 25 2017, 19:00
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(Сергей Борщ @ Jan 25 2017, 19:55)  В некоторых странах летнее время вообще отменяют/восстанавливают по прихоти президента  Ну, для таких случаев есть три варианта, как и с Рамоданом: 1. просто не разрешать эту опцию и работать в "зимнем" времени или вообще в UTC. 2. взять подписку с менеджера системы, что он уведомлен о необходимости переконфигурирования до наступления каждого нового периода летнего(зимнего) времени и прошел тренинг "как это делать". 3. Эксклюзивная прошивка с любыми хотелками, хоть семь с половиной переводов ежемесячно. Больше капризов- больше денег. Можем делать новую прошивку каждый год. На самом деле, (2) это самый рабочий вариант, если вообще нужен этот перевод зимнее/летнее. Запросто пишется центральный скрипт, который с центральной машины обновляет конфиг файлы по всей подключенной системе. P.S. еще раз Спасибо всем откликнувшимся!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|