Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将时间(由字符串表示)从一个时区转换为另一个时区_C_Datetime_Timezone - Fatal编程技术网

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

C 将时间(由字符串表示)从一个时区转换为另一个时区,c,datetime,timezone,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, &a

在我的应用程序中,我将用户指定的时间转换为
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取代


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

我的系统(OS X)上的
strtime
手册页上写着:

%Z格式说明符只接受 本地时区,或值“GMT”。这种限制是因为 由于时区缩写的过度加载而导致的歧义。一个 例如东部标准时间和东部标准时间 澳大利亚夏季时间

因此,这一行:

char* val = strptime(SAMPLETIME, INPUTFMT, &tm);
正在悄无声息地忽略输入中的“EST”,而是使用当前的本地时间偏移量。因此,当您将其从当前本地时间转换回此处时:

strftime (buf, 100, OUTPUTFMT, t1);
您可以获得从当前本地时间到UTC再回到当前本地时间的往返行程


有关如何处理时区的更多建议,请参阅此语言中性。

@stackptr,即使语义是常量?非常确定所有caps都是c/c++常量命名的标准。c没有符号常量。它不是C++。code>const限定对象在语义上仍然是变量。请改用宏。@Olaf Semantic,如“关联[of]的[the]含义”?@user2864740:只需遵循语言语义即可。在C语言中,要么使用枚举常量(真正的符号常量,但总是
int
并且语法上有问题),要么使用宏——这是常见的方法。C不是C++,因此你不应该尝试用C来编码C++风格(反之亦然)。而且指针不是常量!