2016-08-30 1 views
3

Я рассматривал this и this, на SO, но они имеют дело с вариациями не-С той же проблемой.Начала Сокращенного часового пояса с помощью STRFTIME() с помощью C

Использование GNU GCC компилятор (Code :: Blocks, в Windows) со следующим кодом:

int main(void) 
{ 
    time_t rawtime; 
    struct tm *info; 
    char timeStr[80]; 

    time(&rawtime); 
    info = localtime(&rawtime); 

    strftime(timeStr,80,"%a %b %d %H:%M:%S %Z %Y", info); 

    printf("%s", timeStr); 
    getchar(); 

    return 0; 
} 

Я получаю эту строку времени:

Tue Aug 30 14:55:08 Pacific Daylight Time 2016

Все в порядке, кроме часового пояса. Я предпочитаю, чтобы быть сокращен, такими как:

вт 30 августа 14:55:08 PDT 2016

В каждой странице человека или окно документации STRFTIME() я могу найти описание спецификатора формата% Z выглядит примерно так: имя часового пояса или аббревиатура. (eg. here.)

Какая уловка для форматирования часового пояса сокращается?

+0

«Среднее время по Гринвичу» * сокращено до «GMT», но мы никогда не видим «GMTDT». –

+0

Вы посмотрели, что Microsoft говорит о его ['strftime()') (https://msdn.microsoft.com/en-us/library/aa272978 (v = vs.60) .aspx)? Является ли ваш компилятор настроен на сборку с библиотеками времени выполнения Microsoft C или некоторыми другими библиотеками времени выполнения C? –

+0

@WeatherVane - LOL, хороший момент. Я вижу временные метки, исходящие от устройства, которое я использую, используя Linux как OS, у которого есть сокращенный часовой пояс. Возможно, это конкретная реализация? – ryyker

ответ

4

strftime не гарантирует, что вы получите полное имя или аббревиатуру. Это зависит от реализации. Спецификация C99 (and Microsoft's documentation) говорит:

% Z заменяется именем зоны времени в локали или аббревиатуры, или каких-либо символов, если зона не может быть определена.

AFAIK нет стандарта C, чтобы гарантировать, что вы получите сокращение от часового пояса. Предполагается, что вы используете базу данных часовых поясов системы. Вы могли бы ship with your own copy of the time zone database.

В общем, аббревиатуры часовых поясов - плохая идея, потому что они неоднозначны. Skimming the list мы находим, что ACT, AMT, BST, ECT, GST, IST, LHST, MST, PST и SST все неоднозначны. Вам лучше использовать полное имя, числовое смещение (то есть %z) или вообще отказаться от часовых поясов и использовать UTC (особенно полезно для ведения журнала).

+1

«AFAIK нет стандартного способа C, чтобы гарантировать, что вы получите сокращение времени в часовом поясе». Правильно. В Windows вы получаете полное имя под Unix и Linux и другими системами, которые основаны на коде часового пояса Артура Дэвида Олсона (включая MacOS), вы получаете аббревиатуру, и нет способа спросить об этом или другом. –

+0

@SteveSummit - Я бы нажал на это в ответ. Это добавляет к разговору (и к моему пониманию) четкие недвусмысленные высказывания о поведении часовых поясов strftime(). Спасибо. – ryyker

2

Мне недавно нужно было то же самое, и я решил, что нет Хорошего ответа. Я написал код грубой силы для сопоставления строк часовых поясов Windows, таких как «Восточное стандартное время», «EST», но я знал, что (a) это была плохая идея, и (б) мой список переводов никогда не будет завершен.

Смежные вопросы