1

我正在使用 strptime 使用以下格式化程序解析用户日期输入字符串:%F %T %z对于 format YYYY-MM-DD HH:MM:SS +-UTC offset。我想添加一个选项,以便用户可以指定夏令时是否有效(0 或 1),并进行tm_isdst相应设置。这很重要,因为我稍后使用用户的输入转换为 UTC 纪元时间,而本地时区偏移量取决于 DST。我在转换之前存储用户的tm_gmtoff,因为mktime它适应本地时间,然后根据他们的偏移输入进行加减。

有没有我可以使用的格式化程序strptime直接切换 DST,还是我必须想出另一个解决方案?

4

2 回答 2

1

虽然给出的答案告诉了我很多关于 strptime 和 UTC 偏移量的信息,但我的问题是是否有办法通过 strptime 设置 DST,因为我担心的是 mktime() 使用系统的本地时间。不幸的是,没有格式化程序,所以我重写了代码以根据提供的小时偏移量手动转换为 UTC,然后使用 gmtime 转换为纪元时间戳。

于 2013-06-24T20:42:22.740 回答
0

正如@Jonathan Leffler 指出的那样,查看 UTC 偏移量的常用方法YYYY-MM-DD HH:MM:SS +-UTC offset日期和时间与 UTC 的偏移量,而不是用户时区的标准偏移量。因此没有关于时区名称和 DST 规则的信息,只是一个偏移量。

要将输入转换为 time_t(UTC 纪元),如果strptime()理解%F %T %z,则在strptime()调用后调用gmtime()。无需考虑夏令时。如果您strptime()不明白%z,请自己解析偏移量并从调用的 tm_min 字段中减去分钟结果strptime(),然后调用gmtime()

另一方面,您的应用程序可能会尝试采用不同的方法来提示用户输入用户时区的日期、时间和标准时间偏移量。在这种情况下,需要知道 DST 在该日期和时间是否有效。有各种各样strptime()的,一个可能有一个 DST 标志的 %,但我没有看到一个,你可能需要做工作。如上所述转换,如果设置了 DST,则减去通常的 3600 秒。*3


** 的行为strptime()可能会受到当前语言环境的 LC_CTYPE、LC_TIME 和 LC_TOD 类别的影响。

如果%F不起作用,请尝试%Y-%m-%d.

*3从标准时间到夏令时偏差通常为 3600 秒。我知道当今没有例外。存在历史例外。

于 2013-06-24T17:03:46.813 回答