реклама на сайте
подробности

 
 
> time.h ARMCC
Pridnya
сообщение Dec 5 2016, 06:49
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 24)
Ruslan1
сообщение Jan 23 2017, 19:52
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



jcxz, спасибо!
тоже думаю про похожее, так как хороших вариантов не так уж много.

Интересный вопрос- конфигуратор, в какой форме-формате задавать величины
как задать так чтобы покрыть все хотелки, не тупик в развитии, и при этом чтоб простой парсинг был.
Разглядывал как переменная TZ сделана, это кажется самый универсальный путь. Там два варианта стандартизировано, через день года(абсолютная дата) и через недели (для тривиальных ситуаций). Вкусность в том что это уже документировано, а не новый велосипед.
Осталось выделить нужную часть для использования в конфигураторе, чтобы все не делать. Думаю для начала только кусок с "day d of week w of month m" реализовать, потом разовью если нужно будет.

То есть для примера ниже все уже задокументировано, и не велосипед. Может, и исходники tzset() пригодятся sm.gif
Цитата
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, коррекция на таймзону только в команду чтения локального времени вставлена. Теперь буду там же еще и зиму-лето вставлять. Лично я хорошо понимаю насколько это проблематично, особенно если неразрывность данных нужна и возможна передача в другие системы. Но для локального использования может быть и неплохо иногда.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 24 2017, 10:44
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Ruslan1 @ Jan 23 2017, 20:30) *
Ну хорошо, врукопашную.
А кто как даты перевода задает?
я как-то думал, что можно еще и дефолт сделать(последняя суббота марта...), но, разброд и шатание не поддаются алгоритмизации, понял, что лучше всегда требовать точно задать дату и время перевода, потому как дефолт-понятие растяжимое и у каждого он свой.

Ну я так и задаю. У меня 407 проц. Я календарь веду. То есть я контролирую дни недели. И перехожу (если опция включена) на летнее/ зимнее время согласно принятому. времени перехода.
Осуществляется это в диагностической задаче у меня. Сам переход выполняет проц аппаратно, но там тоже надо танцы с бубном делать. То есть в нужный момент включить признак, а потом выключить.
Сам проц не переходит.
У меня это контролируется в ТУ, поэтому проверяется на приёмочных и периодических испытаниях.
В старом приборе записывались даты и время перехода таблично... ))
Прикололся. )) Всё равно календарь веду, так я его вывожу одним из меню
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jan 24 2017, 12:13
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 24 2017, 12:20
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(aiwa @ Jan 24 2017, 14:03) *
Добавлю, тоже по памяти, там еще был флажок полушария: северное или южное.

мне кажется, что это лишняя сущность.
И что указать в экваториальных странах, которые и в том и в этом? (Свят-свят! не хотел бы я там что-нить ставитьsm.gif)
Для вычисления достаточно просто честно проверять даты начала и конца указанной зоны при условии что событие не чаще раза в год, а не смотреть на начало-конец года.

в-общем, проникся я как tzset() работает, красиво. В будущем- нужно просто переменную TZ честно поддерживать, к чему и буду стремиться. Не нужно в этой области велосипедов, все уже придумано до для нас. Но сейчас сделаю еще более простую реализацию, чтоб не менять уже давно написанное в данном проекте.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jan 24 2017, 12:26
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Ruslan1 @ Jan 24 2017, 14:20) *
мне кажется, что это лишняя сущность.

Для вычисления достаточно просто честно проверять даты начала и конца указанной зоны при условии что событие не чаще раза в год, а не смотреть на начало-конец года.


Как раз этот флажок и нужен для проверки начала и конца указанной зоны, а точнее, его участие заключается в том что он для южного полушария всего лишь меняет местами начало и конец DLT-зоны. Может и не нужен, но используется в виде оператора if лишь один раз в год при построении границ зимнего времени.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 24 2017, 13:04
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aiwa @ Jan 24 2017, 15:13) *
Добавлю, тоже по памяти, там еще был флажок полушария: северное или южное.

Не помню флажка.
А Вы разве в нашем проекте участвовали???
И Вас в нашем проекте тоже не помню biggrin.gif
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jan 24 2017, 13:37
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(jcxz @ Jan 24 2017, 15:04) *
Не помню флажка.
А Вы разве в нашем проекте участвовали???
И Вас в нашем проекте тоже не помню biggrin.gif

Наверное в качестве флажка.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jan 25 2017, 17:44
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Ruslan1 @ Jan 24 2017, 14:20) *
Для вычисления достаточно просто честно проверять даты начала и конца указанной зоны при условии что событие не чаще раза в год, а не смотреть на начало-конец года.

Хотите, обломаю на взлете? В некоторых мусульманских странах (например, Марокко) на время Рамадана всегда действует зимнее время! Если Рамадан, который еще и "плывет" с годами в обратную сторону, как-то цепляет летнее время, начинаются очень интересные вещи! Алла, я в бар!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2017, 17:55
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (KnightIgor @ Jan 25 2017, 19:44) *
Хотите, обломаю на взлете? В некоторых мусульманских странах
В некоторых странах летнее время вообще отменяют/восстанавливают по прихоти президента wink.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Jan 25 2017, 19:00
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Сергей Борщ @ Jan 25 2017, 19:55) *
В некоторых странах летнее время вообще отменяют/восстанавливают по прихоти президента wink.gif

Ну, для таких случаев есть три варианта, как и с Рамоданом:
1. просто не разрешать эту опцию и работать в "зимнем" времени или вообще в UTC.
2. взять подписку с менеджера системы, что он уведомлен о необходимости переконфигурирования до наступления каждого нового периода летнего(зимнего) времени и прошел тренинг "как это делать".
3. Эксклюзивная прошивка с любыми хотелками, хоть семь с половиной переводов ежемесячно. Больше капризов- больше денег. Можем делать новую прошивку каждый год.

На самом деле, (2) это самый рабочий вариант, если вообще нужен этот перевод зимнее/летнее. Запросто пишется центральный скрипт, который с центральной машины обновляет конфиг файлы по всей подключенной системе.

P.S. еще раз Спасибо всем откликнувшимся!
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2025 - 22:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016