我使用strptime用以下格式化程序解析用户日期输入字符串:%F %T %z
格式为YYYY-MM-DD HH:MM:SS +-UTC offset
。我想添加一个选项,以便用户可以指定夏令时是否生效(0或1),并相应地设置tm_isdst
。这很重要,因为我后来使用用户的输入转换为UTC纪元时间,本地时区偏移取决于DST。我在转换之前存储用户的tm_gmtoff
,因为mktime
适应本地时间,然后根据其偏移输入进行加或减。
我可以在strptime
内使用任何格式器来直接切换DST,还是我必须找出另一种解决方案?
答案 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秒。我知道没有现在的例外情况。存在历史例外。