【问题标题】:strptime Function and toggling tm_isdststrptime 函数和切换 tm_isdst
【发布时间】: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()的结果中获取“纪元时间”。

标签: c time timezone


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    要将该输入转换为 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 秒。我知道当今没有例外。存在历史例外。

    【讨论】:

    • “3600 秒的倍数”有例外。纽芬兰在 UTC-04:30 运行,采用夏令时;印度在 UTC+05:30 运行,尼泊尔在 UTC+5:45 运行,两者都没有夏令时。请参阅worldtimezone.com 了解更多信息。
    • @Jonathan Leffler - “DST 偏移量通常是 3600 秒的倍数”的措辞不好。意思是说“由于 DST 导致的偏移更改通常是 3600 秒 - 存在异常。”你同意吗?
    • 对不起 - 是的;我的意思是 UTC 偏移量通常是 3600 的倍数(如上所述除外)。 DST 与标准时间的偏移通常为 1 小时;我相信有例外(澳大利亚的部分地区?)时差为 30 分钟,并且历史上存在有趣的制度,例如英国双夏令时,以及一年中的多次偏移变化(超过 2 次)。人们的创造力无穷无尽。
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2015-11-21
    • 2012-11-30
    • 1970-01-01
    • 2011-06-09
    • 2012-11-07
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多