2017-01-23 2 views
-3

Я пытаюсь напечатать в консоли текущее время в моем локальном часовом поясе (-0600), а затем распечатать время в часовом поясе +0100. В настоящее время я использую gmtime и добавляю 1 к разделу tm_hour.Печать текущего времени в разных часовых поясах в C

Однако при использовании strftime он по-прежнему печатает: «... +0000».

Как правильно напечатать его? Как я могу, например, изменить действующий часовой пояс?

+3

показать свой код – eyllanesc

+0

Вы используете платформу POSIX, которая поддерживает функции типа 'tzset' или имеет глобальные значения, такие как' tzname', 'timezone' и' daylight'? –

ответ

1

В MacOS Сьерра 10.12.2 с GCC 6.3.0, следующий код работает:

#include "posixver.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
#include <unistd.h> 

#ifndef lint 

extern const char jlss_id_settz_c[]; 
const char jlss_id_settz_c[] = "@(#)$Id: settz.c,v 1.2 2017/01/23 07:06:21 jleffler Exp $"; 
#endif 

static void time_convert(time_t t0, char const *tz_value) 
{ 
    char old_tz[64] = "-none-"; 
    char *tz = getenv("TZ"); 
    if (tz != 0) 
     strcpy(old_tz, tz); 
    setenv("TZ", tz_value, 1); 
    tzset(); 
    char new_tz[64]; 
    strcpy(new_tz, getenv("TZ")); 
    char buffer[64]; 
    struct tm *lt = localtime(&t0); 
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", lt); 
    if (strcmp(old_tz, "-none-") == 0) 
     unsetenv("TZ"); 
    else 
     setenv("TZ", old_tz, 1); 
    tzset(); 
    printf("%ld = %s (TZ=%s)\n", (long)t0, buffer, new_tz); 
} 

int main(void) 
{ 
    time_t t0 = time(0); 
    char *tz = getenv("TZ"); 
    if (tz != 0) 
     time_convert(t0, tz); 
    time_convert(t0, "UTC0"); 
    time_convert(t0, "IST-5:30"); 
    time_convert(t0, "EST5"); 
    time_convert(t0, "EST5EDT"); 
    time_convert(t0, "PST8"); 
    time_convert(t0, "PST8PDT"); 
} 

По умолчанию TZ не установлен в окружающей среде - эти неуклюжие тесты для getenv("TZ") возвращающих NULL необходимо обрабатывать что. При запуске, выход:

$ ./settz 
1485155290 = 2017-01-23 07:08:10 (TZ=UTC0) 
1485155290 = 2017-01-23 12:38:10 (TZ=IST-5:30) 
1485155290 = 2017-01-23 02:08:10 (TZ=EST5) 
1485155290 = 2017-01-23 02:08:10 (TZ=EST5EDT) 
1485155290 = 2017-01-22 23:08:10 (TZ=PST8) 
1485155290 = 2017-01-22 23:08:10 (TZ=PST8PDT) 
$ 

С окружающей средой, установленной так TZ=US/Alaska, выход:

$ TZ=US/Alaska ./settz 
1485155395 = 2017-01-22 22:09:55 (TZ=US/Alaska) 
1485155395 = 2017-01-23 07:09:55 (TZ=UTC0) 
1485155395 = 2017-01-23 12:39:55 (TZ=IST-5:30) 
1485155395 = 2017-01-23 02:09:55 (TZ=EST5) 
1485155395 = 2017-01-23 02:09:55 (TZ=EST5EDT) 
1485155395 = 2017-01-22 23:09:55 (TZ=PST8) 
1485155395 = 2017-01-22 23:09:55 (TZ=PST8PDT) 
$ 

Это некрасиво как техник; это также не быстро. Однако на некоторых платформах это действительно работает.

+0

Что касается 'char new_tz [64];', я бы ожидал, что этот код будет использовать 'char new_tz [42 + 1];' [Уважаемая ссылка] (http://stackoverflow.com/questions/3477347/php-tz- длина установки # comment3629648_3477491), но [не паникуйте] (https://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker's_Guide_to_the_Galaxy). ;-) – chux

+0

@chux: О, он? Да, он иногда знает, что он говорит. Этот вопрос касался минимальной длины, а 42 выступал (язык в щеку) за «более 30». И, конечно, 42 - это ответ на вопрос о жизни, Вселенной и обо всем. Использование 64 дает больше возможностей - я бы предпочел быть в безопасности, чем сожалеть, за исключением того, что код должен гарантировать, что скопированная строка не слишком длинная, но не делает этого. OTOH, это был только демо-код, который я создал в 2012 году (и этот код разбился, когда я его проверил, из-за отсутствия переменной окружения TZ - следовательно, обновление вчера). –

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

  • Нет связанных вопросов^_^