在我的应用中,我将用户指定的时间转换为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替换。
我想知道我做错了什么。问候。
答案 0 :(得分:3)
我系统(OS X)上strptime
的手册页说:
%Z格式说明符只接受时区的缩写 当地时区,或价值" GMT"。这种限制是因为 由于时区缩写的过载而导致的模糊性。一 这样的例子是EST,它既是东部标准时间又是东部标准时间 澳大利亚夏令时。
这一行:
char* val = strptime(SAMPLETIME, INPUTFMT, &tm);
默默地忽略了" EST"在输入中,改为使用当前的本地时间偏移量。因此,当您从当前的当地时间将其转换回来时:
strftime (buf, 100, OUTPUTFMT, t1);
您可以从当前本地时间到UTC并返回当前时间。
有关如何处理时区的更多建议,请参阅此语言中立 stack overflow answer。