【问题标题】:How to remove the tzinfo completely from the time after converting to UTC in Python?python - 如何在Python中转换为UTC后完全删除tzinfo?
【发布时间】:2015-03-14 10:32:26
【问题描述】:

我遇到了这个确切的issue,但我不知道如何在我的情况下实现解决方案。

圭多说

解决方案是从之后的时间完全删除 tzinfo 转换为 UTC。

这是我尝试过的:

        date_time = parser.parse(i.pubDate.text)
        news.publication_date = date_time.replace(tzinfo=None).date()

我得到了同样的错误:

NotImplementedError: DatetimeProperty publication_date_time can only support UTC. Please derive a new Property to support alternative timezones.

所以看来我必须先将日期转换为 UTC。在这里,我的研究失败了。

我遇到了这个solution

建议的解决方案是这样的:

def date_time_to_utc(date_time):
        tz = pytz.timezone('???')
        return tz.normalize(tz.localize(date_time)).astimezone(pytz.utc)

但我没有时区。我正在从 html 源中抓取日期。所以时区可能真的来自世界上的任何地方。是否没有简单可靠的方法将日期时间转换为 UTC? 我可以同时使用dateutilpytz 来实现这一点。非常感谢。

更新 这真是漫长的一天。我误读了堆栈跟踪。但是问题仍然有效。

date_time = (datetime}2015-01-13 18:13:26+00:00
news.publication_date_time = date_time

这导致了崩溃。似乎通过这样做,我通过了单元测试:

news.publication_date_time = date_time.replace(tzinfo=None)

这是将 GMT 0 日期时间转换为 UTC 日期时间的正确方法吗?或者实际上是 UTC 的任何时区?

【问题讨论】:

  • 您发布的代码(“这是我尝试过的:”)显示您将“天真的”日期时间转换为日期,但错误来自 DatetimeProperty。跟踪是否肯定会导致您显示的代码?它看起来是正确的......
  • @Houman:在.date() 之前不需要.replace(tzinfo=None)。它返回一个总是天真的date 对象。

标签: python google-app-engine datetime pytz python-dateutil


【解决方案1】:

我是个白痴,来晚了,这次我读了这个问题。

tstmp= date_time.replace(tzinfo=utc).total_seconds()
naive_date = datetime.utcfromtimestamp(tstmp)

第一个答案只会给你当前的幼稚时间

【讨论】:

    【解决方案2】:

    试试这个:

    dateTime = dateTime.replace(tzinfo=None)
    dtUtcAware = pytz.UTC.localize(dateTime)
    

    【讨论】:

      【解决方案3】:

      这是将 GMT 0 日期时间转换为 UTC 日期时间的正确方法吗?或者实际上是 UTC 的任何时区?

      如果 aware 日期时间对象已经在 UTC (+0000) 中,那么您的公式有效:

      naive_utc = aware_utc.replace(tzinfo=None)
      

      其中aware_utc 是一个可感知时区的日期时间对象,它以 UTC 表示时间。

      但是如果aware datetime 对象不是UTC;它失败。在一般情况下,您应该考虑(可能)非零 UTC 偏移量:

      assert aware.tzinfo is not None and aware.utcoffset() is not None
      # local time = utc time + utc offset (by definition)
      # -> utc = local - offset
      naive_utc = aware.replace(tzinfo=None) - aware.utcoffset()
      

      其中aware 是任意时区中的时区感知日期时间对象。


      但我没有时区。我正在从 html 中抓取日期 资源。所以时区可能真的来自世界上的任何地方。是 没有简单可靠的方法将日期时间转换为 UTC?我可以 使用 dateutil 和 pytz 来实现这一点。非常感谢。

      没有。 dateutilpytz 对您没有帮助,除非日期字符串本身包含时区(或至少包含其 UTC 偏移量)。

      记住:地球上总是中午某处,也就是说,如果你从地球上不同的地方收集日期/时间字符串,那么除非你附上,否则你无法比较它们对应的时区。您无法将其转换为 UTC,如果您不知道日期的源时区,则无法获得有效的 POSIX 时间戳。

      【讨论】:

      • 请您解释一下aware_utc 是什么意思? GMT +1 是 aware_utc 吗?
      • @Houman:是的。不。 aware_utc alwayszero UTC 偏移量。 GMT+1 意味着 1 小时 UTC 偏移量,即 GMT+1 不是 aware_utc。只需使用我提供的公式即可。它总是有效的。
      • 非常感谢您的解释。因此,如果我的日期时间始终以 GMT 显示,则将其转换为这样更安全:naive_utc = aware.replace(tzinfo=None) - aware.utcoffset()。当心我住在英国,在冬天,我们的 UTC/GMT 偏移量为零,因此看起来是一样的。因此我在date_time = (datetime}2015-01-13 18:13:26+00:00 上面提供的日期应该是 GMT +0,它不是 UTC。 (除非我把它弄混了,而且显示的格式实际上是 UTC 和 GMT 的写法不同):)
      • @Houman:是的。如果偏移量可能不为零,那么您应该使用更通用的公式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2011-03-31
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多