【发布时间】:2013-06-21 01:37:48
【问题描述】:
我正在使用 strptime 使用以下格式化程序解析用户日期输入字符串:%F %T %z 用于格式 YYYY-MM-DD HH:MM:SS +-UTC offset。我想添加一个选项,以便用户可以指定夏令时是否有效(0 或 1),并相应地设置 tm_isdst。这很重要,因为我稍后使用用户的输入转换为 UTC 纪元时间,而本地时区偏移量取决于 DST。我在转换之前存储用户的tm_gmtoff,因为mktime 适应本地时间,然后根据他们的偏移输入进行加减运算。
我可以在strptime 中使用任何格式化程序来直接切换夏令时,还是我必须想出另一个解决方案?
【问题讨论】:
-
如果您有一个与 UTC 的数字偏移量,那么用户的时区是夏令时还是标准时间都没有关系。当你有一个时区名称时,这很重要。即使您从 01:59:59 回退到 01:00:00 的秋季小时,对于数字时区偏移量也是明确的; 01:30:00 的值出现两次,但有两个不同的数字偏移量。
-
这对我来说很重要,因为我稍后会根据用户的 UTC 偏移量和输入的时区来确定 UTC 偏移量。如果是本地时间(DST 期间的 -04 偏移量),我会以一种方式调整为 UTC,因为 mktime 默认为本地时间,而如果用户不在本地时区,我会使用 mktime 和本地时间的偏移量以不同的方式调整为 UTC。了解本地时区的本地偏移量是 -04 小时还是 -05 小时对我的转换很重要。
-
我很困惑。如果我输入:2013-xx-yy 08:31:23 -05:00,无论我是在美国/中部,是标准时间还是在美国/东部和夏令时,都无关紧要; UTC 时间仍然是 2013-xx-yy 13:31:23,因为时区偏移是用数字表示的。那么,你有什么用户类型?他们是在指定数字偏移量,还是您的程序在推断它?在
strptime()推断出数字偏移后,您可能对mktime()等人有疑问;但这不是strptime()可以提供的帮助。时区处理在 C(标准或 POSIX)中充其量是基本的。 -
他们指定了数字偏移量。但是,我正在使用 if else 使用 mktime 转换为纪元 - 如果本地(即 DST 期间的 14000 偏移量),做一件事,否则,mktime 并减去 UTC 偏移量。我这样做是为了解决 mktime 默认为本地时区的问题。但是,本地偏移量因 UTC 而异,如果我可以简单地切换 DST(如果偏移量 == 14000 && DST == 1),这将变得更加容易。如果无法切换,我的转换将在标准时间内出错。
-
你可以调用timegm() function从strptime()的结果中获取“纪元时间”。