strptime函数和切换tm_isdst

时间:2013-06-24 13:56:52

标签: c time timezone

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

我可以在strptime内使用任何格式器来直接切换DST,还是我必须找出另一种解决方案?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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


** strptime()的行为可能会受到当前区域设置的LC_CTYPE,LC_TIME和LC_TOD类别的影响。

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

* 3从标准时间到白天时间偏移的差异通常为3600秒。我知道没有现在的例外情况。存在历史例外。