相关疑难解决方法(0)

pytz localize vs datetime replace

我在pytz的.localize()函数中遇到了一些奇怪的问题.有时它不会调整本地化的日期时间:

.localize行为:

>>> tz
<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD> 
>>> d
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421)

>>> tz.localize(d)
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421, 
                  tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
>>> tz.normalize(tz.localize(d))
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421,
                  tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)

如您所见,由于本地化/规范化操作,时间没有改变.但是,如果使用.replace:

>>> d.replace(tzinfo=tz)
datetime.datetime(2009, 9, 2, 14, 45, 42, 91421, 
                  tzinfo=<DstTzInfo 'Africa/Abidjan' LMT-1 day, 23:44:00 STD>)
>>> tz.normalize(d.replace(tzinfo=tz))
datetime.datetime(2009, 9, 2, 15, 1, 42, 91421,
                  tzinfo=<DstTzInfo 'Africa/Abidjan' GMT0:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)

这似乎调整了日期时间.

问题是 - 这是正确的,为什么其他的错?

python timezone datetime utc pytz

47
推荐指数
4
解决办法
4万
查看次数

pytz奇怪的时区问题

>>> import pytz
>>> pytz.timezone('Asia/Hong_Kong')
<DstTzInfo 'Asia/Hong_Kong' LMT+7:37:00 STD>
Run Code Online (Sandbox Code Playgroud)

7小时37分钟的偏移量?这有点奇怪,有没有人遇到同样的问题?

事实上,我之间的行为有所不同

import pytz
from datetime import datetime
hk = pytz.timezone('Asia/Hong_Kong')

dt1 = datetime(2012,1,1,tzinfo=hk)
dt2 = hk.localize(datetime(2012,1,1))
if dt1 > dt2:
   print "Why?"
Run Code Online (Sandbox Code Playgroud)

python pytz

41
推荐指数
3
解决办法
5579
查看次数

使用pytz的Datetime时区转换

这只是另一篇文章pytz.

有两个函数可以在两个时区之间转换日期时间对象.第二个功能适用于所有情况.第一个函数在两种情况下失败,(3)和(4).类似的SO帖子没有这样的问题.任何解释基础上的区别localize(datetime.datetime)replace(tzinfo)将是一个很大的帮助.

>>> from dateutil.parser import parse
>>> import pytz
Run Code Online (Sandbox Code Playgroud)

第一个功能(越野车)

以下功能使用datetime.datetime.replace(tzinfo).

def buggy_timezone_converter(input_dt, current_tz='UTC', target_tz='US/Eastern'):
    '''input_dt is a datetime.datetime object'''
    current_tz = pytz.timezone(current_tz)
    target_tz = pytz.timezone(target_tz)
    target_dt = input_dt.replace(tzinfo=current_tz).astimezone(target_tz)
    return target_tz.normalize(target_dt)
Run Code Online (Sandbox Code Playgroud)

现在注意四个日期时间转换.

(1)从UTC到EST - 好的

>>> buggy_timezone_converter(parse('2013-02-26T04:00:00'))
Out[608]: datetime.datetime(2013, 2, 25, 23, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)

(2)从UTC到EDT - 好的

>>> buggy_timezone_converter(parse('2013-05-26T04:00:00'))
Out[609]: datetime.datetime(2013, 5, 26, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
Run Code Online (Sandbox Code Playgroud)

(3)从EST到UTC - 不行.时间偏移是4小时56分钟.它应该是5个小时 …

python timezone datetime pytz python-2.7

11
推荐指数
1
解决办法
4390
查看次数

创建时区感知日期时间对象的两种方法(Django)。相差七分钟?

到目前为止,我认为创建时区感知日期时间的两种方法是相同的。

但他们不是:

import datetime

from django.utils.timezone import make_aware, get_current_timezone

make_aware(datetime.datetime(1999, 1, 1, 0, 0, 0), get_current_timezone())

datetime.datetime(1999, 1, 1, 0, 0, 0, tzinfo=get_current_timezone())
Run Code Online (Sandbox Code Playgroud)
datetime.datetime(1999, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)

datetime.datetime(1999, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>)
Run Code Online (Sandbox Code Playgroud)

在 Django 管理 GUI 中,第二种方式创建此(德语日期格式 dd.mm.YYYY):

01.01.1999 00:07:00
Run Code Online (Sandbox Code Playgroud)

如果我使用这个,为什么会有 7 分钟的差异:

datetime.datetime(1999, 1, 1, 0, 0, 0, tzinfo=get_current_timezone())
Run Code Online (Sandbox Code Playgroud)

python django datetime django-timezone

8
推荐指数
1
解决办法
2172
查看次数

如何使用datetime模块获取python中的第一个和最后一个

如何使用datetime模块获取python中的第一个和最后一个,这意味着00:00:01和23:59:59.

我想在今天之前获得六个日期时间.

所以,例如:

今天12月10日,我想得到

12/9 00:00:01和23:59:59

...

12/4 00:00:01和23:59:59

非常感谢你.

python datetime

3
推荐指数
1
解决办法
2689
查看次数

如何强制 pytz 使用当前标准时区?

考虑以下:

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 的偏移量。

python timezone datetime pytz

2
推荐指数
1
解决办法
1135
查看次数

标签 统计

python ×6

datetime ×5

pytz ×4

timezone ×3

django ×1

django-timezone ×1

python-2.7 ×1

utc ×1