将时间(由字符串表示)从一个时区转换为另一个时区

时间:2016-02-23 01:14:53

标签: c datetime timezone

在我的应用中,我将用户指定的时间转换为time_t格式并存储它。稍后,我会在本地时区显示此时间。这是我的测试代码:

int main() {
  const char* INPUTFMT =  "%b %d, %Y %H:%M:%S %Z";
  const char* SAMPLETIME = "Feb 19, 2016 01:00:00 EST";

  struct tm tm = {0};
  char* val = strptime(SAMPLETIME, INPUTFMT, &tm);

  time_t st = mktime(&tm);

  const struct tm* t1 = localtime(&st);
  static const char* OUTPUTFMT = "%b %d, %G %I:%M:%S %p %Z";
  char buf[100];
  strftime (buf, 100, OUTPUTFMT, t1);

  printf("%s\n", buf);

  return 0;
} 

指定的时区是EST,我的本地时区是PST。

我遇到的问题是,虽然我的本地时区与指定的时区不同,但我看到同一时间,除了EST被PST替换。

我想知道我做错了什么。问候。

1 个答案:

答案 0 :(得分:3)

我系统(OS X)上strptime的手册页说:

  

%Z格式说明符只接受时区的缩写   当地时区,或价值" GMT"。这种限制是因为   由于时区缩写的过载而导致的模糊性。一   这样的例子是EST,它既是东部标准时间又是东部标准时间   澳大利亚夏令时。

这一行:

char* val = strptime(SAMPLETIME, INPUTFMT, &tm);

默默地忽略了" EST"在输入中,改为使用当前的本地时间偏移量。因此,当您从当前的当地时间将其转换回来时:

strftime (buf, 100, OUTPUTFMT, t1);

您可以从当前本地时间到UTC并返回当前时间。

有关如何处理时区的更多建议,请参阅此语言中立 stack overflow answer