在我的应用程序中,我将用户指定的时间转换为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("%sn", buf);
return 0;
}
指定的时区是 EST,我的本地时区是太平洋标准时间。
我遇到的问题是,尽管我的本地时区与指定的时区不同,但我看到的时间相同,只是 EST 被 PST 取代。
我想知道我做错了什么。问候。
我的系统(OS X)上strptime
的手册页显示:
%Z 格式说明符仅接受 本地时区,或值"GMT"。 此限制是因为 由于时区缩写的过载而导致的歧义。 一 这样的例子是东部标准时间和东部时间的EST 澳大利亚夏令时。
因此,这一行:
char* val = strptime(SAMPLETIME, INPUTFMT, &tm);
静默忽略输入中的"EST",而是使用当前的本地时间偏移量。 因此,当您在此处将其从当前本地时间转换回来时:
strftime (buf, 100, OUTPUTFMT, t1);
您可以从当前当地时间到 UTC 并返回当前当地时间。
请参阅此中性语言堆栈溢出答案,以获取有关如何处理时区的更多建议。