【发布时间】:2022-07-07 00:13:38
【问题描述】:
我试图在设置时区时以秒为单位(unix 纪元)获取本地时间。 例如
1643371200 是 2022-01-28 12:00:00,UTC0
这可以通过 gettimeofday(tv, NULL) 读取为带有 timeval 结构的秒数。
现在假设我通过 setenv("TZ","CET-1CEST,M3.5.0,M10.5.0/3",1) 将我的本地时区设置为欧洲/柏林。
当我使用时
localtime_r(&now, &local_tv);
char strftime_buf[64];
strftime(strftime_buf, sizeof(strftime_buf), "%c", &local_tv);
printf("get local time: %s", strftime_buf);
这会按预期打印 2022-01-28 13:00:00 (+1h)。
现在我使用了 mktime(&local_tv),因为我认为这会以秒为单位提供我的本地时间。但它仍然是 1643371200 (12:00:00)。当我将 mktime() 与 gettimeofday() 一起使用时,我会减少 1 小时,所以 11:00:00 ...
【问题讨论】:
-
像 1643371200 这样的 Unix 时间总是 UTC。当您调用
localtime时,它会应用您的本地时区,作为从 1643371200 转换为本地、人类可读时间的一部分。当您拨打mktime时,它会取消您的本地时区。 -
@SteveSummit 我知道,但我怎样才能获得或将我的本地时间转换为秒?
-
使用
mktime,就像你做的那样。 -
@SteveSummit 但
mktime以UTC 给出,但我希望它是当地时间。 -
Re "我认为这会给我以秒为单位的本地时间。",
mktime(&local_tv)确实 以秒为单位给你本地时间。具体来说,自 Linux 上 1970-01-01T00:00:00+0000 以来的秒数。那你到底想要什么?
标签: c timezone localtime mktime gettimeofday