【问题标题】:Strip down %Z to only return the timezone not daylight savings in python剥离 %Z 只返回时区而不是 python 中的夏令时
【发布时间】:2013-06-14 01:41:44
【问题描述】:

我有一些代码如下所示,但时区 %Z 正在返回:01:04:48 GMT Daylight Time

我需要它返回:格林威治标准时间 01:04:48

import time

timenew = time.strftime('%H:%M:%S %Z')
print timenew

有人知道我该如何解决/做到这一点吗?

【问题讨论】:

  • 我怀疑%z 实际上是给你GMT Daylight Time。根据您的平台和版本,它几乎肯定会给您一个数字偏移量(如+0100)或一个错误。你的意思是%Z
  • 是的,我的错。我会编辑(这只是一个例子)
  • 这闻起来有点像XY problem。为什么要这样做?
  • 正如@AndyHayden 在其他地方指出的那样,“GMT 夏令时”不是真正的时区——而且,如果它是您的平台所称的“英国夏令时”或类似的时区,则为当地时间 01:04:48实际上是 00:04:48 GMT,而不是 01:04:48 GMT。

标签: python python-2.7 time timezone strftime


【解决方案1】:

懒惰的方式:

time.strftime('%H:%M:%S %Z')[:13]

【讨论】:

  • 正是我所需要的,其他人将问题过度复杂化,因为我的意思是可能不正确的结果没有区别。无论哪种方式都赞成。
【解决方案2】:

问题是%Z 根本不是documented 给你任何特定的格式;它只是给你:

时区名称(如果不存在时区则无字符)。

对于 POSIX 平台上的 CPython 2.7 或 3.3,它通常会为您提供美国主要时区格式为 EST/EDT 的内容,但它可能会为您提供格式为GMT/GMT Daylight Time(或 British Summer TimeGMT Summer Time)适用于主要的欧盟时区,但这在任何地方都无法保证,而且你在其他地方得到的结果很难预测。

因此,如果您只关心您的特定平台,并且只关心美国和欧盟的主要时区,并且您知道它会为您提供 GMT Daylight Time(而不是 British Summer Time,您可能不会这样做)想要截断为Bri),你可以这样做:

tz = time.strftime('%Z')[:3]
if tz.endswith('DT'): tz = tz[0] + 'ST'
timenow = time.strftime(''%H:%M:%S ') + tz

如果您查看the source,您可以看到time.strftime 最终只是调用了您平台的strftime。在 POSIX 平台上,the standard 将 %Z 定义为:

替换为时区名称或缩写,如果不存在时区信息,则替换为无字节。 [tm_isdst]

虽然在那个页面上没有说得很清楚,但最终你得到的是外部变量 tzname[0] 或 tzname[1] 的值,具体取决于 isdst,而 Python 公开了 tzset ,所以你可以这样做:

os.environ['TZ'] = 'GMT'
time.tzset()

现在,'%Z' 保证返回 GMT。或者您可以保留 Daylight/Summer Time 支持,但只需提供相同的名称:

os.environ['TZ'] = 'GMT+00GMT'

或者,理想情况下,您可以为活动时区输入正确的 DST 规则,只需替换名称即可。

【讨论】:

  • 问题是 GMT 与其说是一个时区,不如说是一个时间标准,英国有夏令时,但 GMT 没有变化(我认为这与其他时区的工作方式不同)。跨度>
  • @AndyHayden:是的,将英国夏令时称为“GMT”是完全不准确的。但这与其他时区的工作方式并没有真正的不同——将太平洋夏令时间称为“PST”也是不准确的。无论如何,这就是 OP 所要求的。
  • tzset() 仅在 Unix 上可用。
  • @Brent81:既然你只想要“在 POSIX 平台上”,那你为什么认为这是个问题?
  • @abarnert tks 对于您的评论,我只想添加一个提示。我不是提问者。
【解决方案3】:

您可以使用 gmtime 将其强制为 GMT:

In [11]: time.strftime('%H:%M:%S %z', time.gmtime())
Out[11]: '00:13:17 +0000'

不过,现在是 00:13 GMT(而不是 1:13 DST)。

【讨论】:

  • 我认为这不是 OP 真正想要的。
  • @abarnert 说格林威治标准时间 01:00(如果不是)没有任何意义(而且是错误的!),但你可能是对的......
  • 我同意这没有意义,但这正是 OP 所要求的,逐字逐句。
【解决方案4】:

GMT 不针对夏令时进行调整。您可以在this 网站上从马口中听到它。 “%Z”的意思是:

时区名称(如果不存在时区则无字符)。

所以你可以把字符串去掉。

【讨论】:

  • 如果他从他的平台上得到了一个叫做“GMT Daylight Time”的东西,那么不存在这样的时区这一事实并不能帮助他知道如何处理它。此外,这似乎是对另一个布伦特的答案或我的答案(两者都显示了剥离它的方法)的评论,而不是单独的答案。
猜你喜欢
  • 2011-09-30
  • 1970-01-01
  • 2016-11-25
  • 2017-03-26
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多