【问题标题】:Get the date and time for specified timezone获取指定时区的日期和时间
【发布时间】:2018-11-25 11:38:15
【问题描述】:

我在英国 (GMT+1) 有一台服务器,我需要为加拿大 (GMT-5) 存储一个日期。这个比较简单。

//gmt_operator, gmt_hr, gmt_min are all grabbed from a database
//These are the data extracted from GTM+5:00 for example.

//Get UTC+00:00 in seconds
time_t ltime;
time(&ltime);
//Add GMT offset
if (gmt_operator == '+')
    ltime = ltime + (gmt_hr*60*60) + (gmt_min*60);
else if (gmt_operator  == '-')
    ltime = ltime - (gmt_hr*60*60) - (gmt_min*60);
else
    return NULL;
char buff[9];
struct tm * mydate= gmtime(&ltime);
strftime(buff, sizeof(buff), "%Y%m%d", today);
return buff;

在添加偏移量之前我不能使用 tm 结构,因为如果我将 ltime 转换为 tm 结构而不是添加小时和分钟,我可能会溢出小时和分钟。这可以通过 mktime() 来解决,但 mktime 也会转换为本地时间,这是我不想要的。

这个解决方案有一个小问题。时间还剩1小时。这是因为当前的夏令时生效。函数 localtime() 和 mktime() 以某种方式抓取它,但这些函数只在服务器本地时间抓取它,但我需要它用于指定的时间,如 GMT-5:00 或 GMT+2:00。

这对我来说是一个全新的领域,我会很感激有人提出可能的解决方案。我希望这不是重复的,但我还没有找到类似的问题。

【问题讨论】:

    标签: c++ visual-studio-2010 utc


    【解决方案1】:

    到目前为止,您的代码是正确的。 “GMT-5:00”和“GMT+2:00”的含义始终相同,与 DST(夏令时,即夏令时)无关。

    换句话说,DST 已经需要包含在这些规范中。

    例如,在欧洲中部,您不能只说“GMT+01”。您有 CET 和 CEST,表示“GMT+01”或“GMT+02”。

    【讨论】:

    • 所以我的数据源应该纠正这些事情?夏季应该是 GTM-4:00?
    • 如果您的意思是 GMT-4:00(不是 GTM-4:00),那么可以。它是如此简单。原因很简单,像“GMT-5:00”这样的规范并没有说明你指的是哪个国家。在该地区,可能有一些国家有 DST,而另一些国家没有 DST,还有一个国家的 DST 每年的天数略有不同。这只是该主题的表面。因此,这种方法本身是有缺陷的。此外,在每个 Unix/Linux 系统上都有一些 tz_data 包和函数可以让你远离这项工作。
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2021-06-04
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多