我在整个应用程序中使用时区感知对象,但我有一个TimeField来表示一天中的通用每日时间:
class MyModel(models.Modal):
...
start_time = models.TimeField()
Run Code Online (Sandbox Code Playgroud)
但是,在某些时候,我需要timezone.now()
使用服务器的时区将当前时间与 start_time 进行比较,以查看该时间是否在任何给定的一天已经过去。
如何转换start_time
为可比较的时区感知日期时间对象timezone.now()
?
我在用USE_TZ = True
我花了几个小时在这上面,但我的大脑似乎无法弄清楚,而且我发现的很多信息似乎都适用于 Python 2?
import datetime as dt
from datetime import datetime
from pytz import timezone
import pytz
time_stamp = 'Mon, 17 Dec 2018 18:05:01 GMT'
central = timezone('US/Central')
published_time = datetime.strptime(time_stamp, '%a, %d %b %Y %H:%M:%S %Z')
published_cst = published_time.astimezone(central)
actual_time_published = published_cst.strftime('%a, %b %d %Y at %I:%M:%S %p %Z')
print(time_stamp)
print(published_time)
print(published_cst)
print(actual_time_published)
Run Code Online (Sandbox Code Playgroud)
预计 acutal_time_published 为 CST,因为published_cst 有 GMT-6 小时(第三个结果),但这里是每个打印命令的实际结果。
Mon, 17 Dec 2018 18:05:01 GMT
2018-12-17 18:05:01
2018-12-17 18:05:01-06:00
Mon, Dec 17 2018 at 06:05:01 PM CST
Run Code Online (Sandbox Code Playgroud)
拔我的头发! …
我正在尝试将 UTC 时间戳转换为西班牙时区的时间戳。
>>> import datetime as dt
>>> import pytz
>>> today = dt.datetime.utcfromtimestamp(1573516800)
datetime.datetime(2019, 11, 12, 0, 0)
>>> today.replace(tzinfo=pytz.timezone('Europe/Madrid')).timestamp()
1573517700.0
>>> today.replace(tzinfo=pytz.timezone('Etc/GMT+1')).timestamp()
1573520400.0
Run Code Online (Sandbox Code Playgroud)
我很惊讶我得到了不同的结果Europe/Madrid
和Etc/GMT+1
。为什么是这样?应该Europe/Madrid
以不同的方式使用,或者这可能是一个错误?
考虑以下:
from datetime import datetime
import pytz
new_years_in_new_york = datetime(
year=2020,
month=1,
day=1,
hour=0,
minute=0,
tzinfo = pytz.timezone('US/Eastern'))
Run Code Online (Sandbox Code Playgroud)
我现在有一个日期时间对象,代表纽约 1 月 1 日午夜。奇怪的是,如果我使用 pytz 将其转换为 UTC,我会得到一个奇怪的日期时间,相差几分钟:
new_years_in_new_york.astimezone(pytz.utc)
# datetime.datetime(2020, 1, 1, 4, 56, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
请注意,纽约的午夜(以 pytz 表示)是UTC 时间的4:56。在 Stack Overflow 上的其他地方,我了解到这是因为pytz 使用您的/usr/share/zoneinfo
数据,该数据在标准化之前使用本地平均时间来考虑时区。这可以在这里显示:
pytz.timezone('US/Eastern')
# <DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>
Run Code Online (Sandbox Code Playgroud)
看到了吗LMK-1 day, 19:04:00 STD
?这是当地平均时间偏移,不是我想要的偏移,这是美国/东部时间而不是夏令时。
有没有办法强制 pytz 使用当前基于当前日期的标准偏移量集?2020 年新年,应该是 UTC-5。如果我提供的日期是在夏令时期间,我需要 UTC-4。我很困惑为什么 pytz 会在 2020 年日期使用基于 LMT 的偏移量。
我正在尝试将美国/纽约的时间转换为 UTC 时间,然后将其转换回纽约时间。但我在使用 时得到了不同的结果pytz
。
我正在这样做:
new_date = parser.parse("May 4, 2021")
new_date = new_date.replace(tzinfo=pytz.timezone("America/New_York"))
date = new_date.astimezone(pytz.timezone("UTC"))
Run Code Online (Sandbox Code Playgroud)
输出:
datetime.datetime(2021, 5, 4, 4, 56, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
当我尝试将其重新转换回纽约时间时,我得到以下信息:
date.astimezone(pytz.timezone("America/New_York"))
Run Code Online (Sandbox Code Playgroud)
我得到:
datetime.datetime(2021, 5, 4, 0, 56, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么会有 56 分钟的差异,可以采取什么措施来防止这种情况发生?
我正在尝试将(http://pytz.sourceforge.net/)中的pytz timezone包包含到我的Django应用程序(版本1.3)中,因此我可以改进时区功能.我很担心这个python包不会部署到Heroku中的应用程序上.我如何确保在Heroku上部署此包?
或者,如果有人能告诉我指出如何处理Django 1.3中的TZ问题,我会非常感激.
我在阿根廷,我的时间是GMT-3(http://wwp.greenwichmeantime.com/time-zone/south-america/argentina/)
我正在玩Pytz并注意到一些奇怪的东西,看看:
from pytz import timezone
bsas = timezone('America/Argentina/Buenos_Aires')
gmt_plus_3 = timezone('Etc/GMT+3')
gmt_min_3 = timezone('Etc/GMT-3')
# Date and time at this momement: 2012-07-26 10:23:01
fmt = '%Y-%m-%dT%H:%M:%S'
datetime.now(bs).strftime(fmt) #'2012-07-26T10:23:01' <-- GOOD!
datetime.now(gmt_min_3).strftime(fmt) #'2012-07-26T16:25:21' <-- WRONG!
datetime.now(gmt_plus_3).strftime(fmt) #'2012-07-26T10:23:01' <-- GOOD! WTF!
Run Code Online (Sandbox Code Playgroud)
我期待:
GMT-3 should be 10:23:01 and gives me 16:23:01
GMT+3 should be 16:23:01 and gives me 10:23:01
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?我做错了吗?
我使用pytz将时区与我的用户配置文件相关联.最初我认为它只包括PST,CST,EST等时区,但是当我运行时,pytz.country_timezones('US')
我会收到以下列表:
[u'America/New_York', u'America/Detroit', u'America/Kentucky/Louisville', u'America/Kentucky/Monticello', u'America/Indiana/Indianapolis', u'America/Indiana/Vincennes', u'America/Indiana/Winamac', u'America/Indiana/Marengo', u'America/Indiana/Petersburg', u'America/Indiana/Vevay', u'America/Chicago', u'America/Indiana/Tell_City', u'America/Indiana/Knox', u'America/Menominee', u'America/North_Dakota/Center', u'America/North_Dakota/New_Salem', u'America/North_Dakota/Beulah', u'America/Denver', u'America/Boise', u'America/Phoenix', u'America/Los_Angeles', u'America/Metlakatla', u'America/Anchorage', u'America/Juneau', u'America/Sitka', u'America/Yakutat', u'America/Nome', u'America/Adak', u'Pacific/Honolulu']
另外:
pytz.all_timezones
== 582
pytz.common_timezones
== 432
我住在德克萨斯州,总是选择芝加哥,因为这就是互联网的运作方式,但现在我必须考虑到这一点,我真的很困惑我们应该在我们的应用程序中使用哪些时区,哪些是多余的.例如,America/Kentucky/Louisville与America/Kentucky/Monticello相同 - 为什么它们都存在?我知道这与印第安纳州的历史时区惨败有关,但为什么数据库没有更新以删除冗余?
我从来没有住在印第安纳州所以我不知道居民习惯于看到什么时区.另外由于像亚利桑那州这样的异常人员没有参与DST,它并不像仅包括PST,CST等那么简单.
是否有一些正式的TZ数据库时区子集可以解释所有美国居民?
我如何使用 dateutil.tz.tz.tzoffset 类型的对象来本地化具有正确时区和 DST 信息的时区原始日期时间对象,以便它可以正确转换为 UTC?或者,如何将 dateutil.tz.tz.tzoffset 转换为 pytz.timezone?
我一直无法找到有关使用 dateutil.tz.tz.tzoffset 对象本地化日期时间对象的好信息。请参阅下面的一些我审查过的更好的文章。
背景资料:
我正在处理大量日期字符串,其中大多数没有时区信息。在某些情况下,时间是格林威治标准时间,在其他情况下是本地时间。我必须首先确定创建这些各种日志的设备的时区,然后解析各种日期字符串,如果是本地时间,则添加添加时区,最后将其转换为 UTC。
我几乎让这一切都在工作,除了确定时区的唯一可靠方法是从文本文件中获取日期格式为 EDT、IST 等,因此我使用了以下链接中最高投票的帖子来完成这使用 dateutil 的 parser.parse() 函数并将其发送给它的 tzinfos 参数的字典。(在 Python 中使用时区缩写名称解析日期/时间字符串?)
但是,这给我留下了一个 DateTime,它有一个 tzinfo type=dateutil.tz.tz.tzoffset。我没问题,除非我需要使用这个 tzinfo 来本地化不包含时区信息的字符串,并且 dateutil.tz.tz.tzoffset 类型没有像 pytz.timezone 那样的本地化选项,这是关键我的问题。
我让这太难了吗?我是否只是用我保存的 dateutil.tz.tz.tzoffset 对象替换了时区天真日期时间中的 tzinfo ?
代码:
下面读取日期字符串并将其保存为日期时间对象,将时区保存在 var 中以备后用,然后将日期字符串转换为 UTC:
from dateutil.parser import parse as parsedate
import pytz
from pytz import timezone
from datetime import datetime
timestr = 'Sat, 5/01/2019 8:00PM EDT' #only reliable source of timezone info
dtfromstrEDT = parsedate(timestr, tzinfos=tzd) …
Run Code Online (Sandbox Code Playgroud)