我正在尝试使用C在不同的时区(PST)获得时间 .
#define PST (-8);
char* Time::getSecondSystemTime() {
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time(&rawtime);
timeinfo = gmtime(&rawtime);
timeinfo->tm_hour = timeinfo->tm_hour + PST;
strftime(buffer, 80, "%I:%M %p", timeinfo);
std::string temp = std::string(buffer); // to get rid of extra stuff
std::string extraInfo = " Pacific Time ( US & Canada )";
temp.append(extraInfo);
return (char*) (temp.c_str());
}
这里的问题是,当GMT时间少于8小时(例如,现在,早上3点的时间),从它减去8小时不起作用!
在Unix中的不同时区获取时间的正确方法是什么?
3 回答
既然你说"UNIX",这就是使用TZ,但是,
TZ=[what goes here]
你需要找出你系统上的[这里有什么] . 它可能是"America/LosAngeles"或PST的其他几个字符串之一 . 如果您的系统是POSIX:TZ = PST8PST保证可以正常工作 . 但它可能不是最佳的 .原始非 生产环境 代码假定TZ目前尚未使用 . 这是C,而不是C,因为你的标签是C:
我有以下C代码藏起来处理问题 . 效率不是第一个让人想起的词(两次调用
setenv()
,两次调用tzset()
),但标准的C库并不能让它变得更容易:在原始代码中,您必须担心在更改小时偏移后规范化时间结构 . 您可以使用mktime()功能执行此操作 . 这是一个基于问题中的函数的程序,它是纯C并且避免了返回指向局部变量的指针(以及以分号结尾的
#define
)的问题:显然,更好的接口会将UTC时间值和时区偏移量(以小时和分钟为单位)作为参数传递 . 尽管我的计算机默认运行在美国/太平洋(或美国/洛杉矶)时区,但我测试TZ设置为各种值(包括US / Eastern,IST-05:30)并获得正确的值;根据过去的经验,我有理由相信计算是正确的 .
我有另一个程序试图剖析从
mktime()
返回的-1
是由于错误还是因为转换时间对应于(time_t)-1
:这是一种更简洁的方法(此示例获取GMT时间,包括DST偏差):