Мой текущий компьютер показывает время с CET:
$ date
Mon Dec 1 21:31:41 CET 2014
Однако моя локаль en_US:
$ locale | grep -i time
LC_TIME="en_US.UTF-8"
Я хотел бы отформатировать строку эпохи с помощью C в мой текущий местный часовой пояс, но я не знаю, как указать strptime изменить локальный по умолчанию:
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int
main(void)
{
struct tm tm;
char buf[255];
memset(&tm, 0, sizeof(struct tm));
strptime("1412200800", "%s", &tm);
strftime(buf, sizeof(buf), "%c %Z", &tm);
puts(buf);
exit(EXIT_SUCCESS);
}
На странице руководства указано, что оно форматирует время в соответствии с локалью, но, похоже, игнорирует мои настройки:
$ export LC_TIME=de_DE.UTF-8
$ locale | grep -i time
LC_TIME=de_DE.UTF-8
$ ./a.out
Thu Oct 2 00:00:00 2014 CEST
Я ожидаю:
Wed Thu Oct 1 22:00:00 2014 CET
Обновить
Итак, я полностью удалил %s
и попробовал следующий подход, но безуспешно:
#define _XOPEN_SOURCE
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int
main(void)
{
struct tm *tim;
setlocale(LC_ALL, "");
char buf[255];
time_t c;
c = strtoul("1412200800", NULL, 0);
tim = localtime(&c);
strftime(buf, sizeof(buf), "%c" , tim);
puts(buf);
printf("%s %s\n", tzname[0], tzname[1]);
exit(EXIT_SUCCESS);
}
Вывод по-прежнему остается тем, что я ожидал:
gcc strptime_test.c && ./a.out
Thu 02 Oct 2014 12:00:00 AM CEST
CET CEST
обновление 2, решение:
Вместо использования localtime(&c);
теперь я использую:
tim = gmtime(&c);
strftime(buf, sizeof(buf), "%c" , tim);
Которые дают желаемое поведение:
Wed 01 Oct 2014 10:00:00 PM GMT
strftime
- person M.M   schedule 01.12.2014