Python。如何使用 datetime.today() 创建本地日期时间

Posted

技术标签:

【中文标题】Python。如何使用 datetime.today() 创建本地日期时间【英文标题】:Python. How to create a local datetime with 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() 对象?

【问题讨论】:

你好像在找pytz - World Timezone Definitions for Python 看看这个,tommikaikkonen.github.io/timezones,也许这会对你有所帮助 相关:Datetime Timezone conversion using pytz 【参考方案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 代码可能会失败)。


您的代码中有几个问题:

don't use naive_dt.replace(tzinfo=tz) where tz has a non-fixed utc offset. Use tz.localize(naive_dt, is_dst=None) instead

您问题中的时差表明time_from_frontend 可能在UTC(不是您的本地时区)中为@Brendan Abel suggested。要将其与当前时间进行比较,您可以使用 datetime.utcnow() 如果 time_from_frontend 是代表 UTC 时间的天真日期时间对象:

time_diff = datetime.utcnow() - time_from_frontend

要获取时区感知的日期时间,您可以use .replace() with UTC timezone (the utc offset is fixed -- it is always zero), :

frontend_time = time_from_frontend.replace(tzinfo=pytz.utc)

如果两个日期时间对象都可以识别时区,那么减法也可以:

time_diff = local_time - frontend_time

另见:

How to get current time in Python Python: How to get a value of datetime.today() that is “timezone aware”?

【讨论】:

以上是关于Python。如何使用 datetime.today() 创建本地日期时间的主要内容,如果未能解决你的问题,请参考以下文章

FME如何使用Python?

FME如何使用Python?

如何使用python读写文件?

如何使用 Boost.Python 定义 Python 元类?

2.如何使用python连接hdfs

python如何输入矩阵