【问题标题】:Python. How to create a local datetime with datetime.today()Python。如何使用 datetime.today() 创建本地日期时间
【发布时间】:2016-05-23 01:06:00
【问题描述】:

服务器发送我striptime 的字符串并保存在此处称为time_from_frontend 的变量中,然后添加这样的tzinfo:

import pytz

my_timezone = pytz.timezone("America/Guayaquil")

A = time_from_frontend.replace(tzinfo=my_timezone)
print A
print A.tzinfo

B = (datetime.datetime.today()).replace(tzinfo=my_timezone)
print B
print B.tzinfo

print B - A

为什么我会在 A 和 B 之间得到巨大的差异?这是终端打印的内容:

2016-02-11 20:00:00-05:19
America/Guayaquil
2016-02-12 01:08:35.478507-05:19
America/Guayaquil
5:08:35.478507

前端向我发送实际时间,当我执行datetime.today() 然后指定时区时,我以为我会得到 A 时间和 B 时间(即微秒)之间的微小差异,但我得到了 5小时。这是时区差异(“美国/瓜亚基尔”是 GMT-5)。

我有点理解错误。但是我该如何解决呢?有没有办法创建一个与当地时间对应的datetime.today() 对象?

【问题讨论】:

标签: python datetime


【解决方案1】:

我猜你前端的datetime 是UTC。进行替换实际上并不会转换日期时间。它使用数据/小时/等。并且只使用一个新的时区。

当您调用datetime.today() 时,您会创建一个没有任何时区信息的naive 日期时间。当您对此进行 replace 时,它实际上也没有进行转换,它只是假设您提供的日期已经在您提供的时区中,与您在服务器时间所做的替换相同。

要将日期时间转换到另一个时区,您需要使用astimezone。如果来自服务器的日期时间也是 naive 并且没有指定时区,astimezone 将出错。解决这个问题。首先添加UTC 的时区。

time_from_frontend = time_from_frontend.replace(tzinfo=pytz.timezone('UTC'))
converted_server_time = time_from_frontend.astimezone(my_timezone)

【讨论】:

    【解决方案2】:

    datetime.today() 已经返回本地日期时间(结果与datetime.now() 几乎相同)。两者都将本地时间作为简单的 datetime 对象返回(避免使用它们,除非您想立即显示它们)。

    获取给定时区当前时间的正确方法是使用datetime.now(tz)

    #!/usr/bin/env python
    from datetime import datetime
    import tzlocal # $ pip install tzlocal
    
    local_time = datetime.now(tzlocal.get_localzone())
    

    即使在 DST 转换期间本地时间可能不明确(在这种情况下使用幼稚的 datetime.today() 可能会失败),它也可以工作。

    tzlocal 返回一个 pytz tzinfo 对象,因此它处理过去可能具有不同 UTC 偏移量的时区(在这种情况下,非 pytz 代码可能会失败)。


    您的代码中有几个问题:

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 2011-01-06
      • 2011-11-20
      相关资源
      最近更新 更多