我如何在Python中使用时区与datetime对象?

11 浏览
0 Comments

我如何在Python中使用时区与datetime对象?

如何正确表示不同时区在我的时区中的时间?下面的示例仅适用于我知道EDT比我提前一小时的情况,因此我可以取消对myTimeZone()的减法注释。

import datetime, re
from datetime import tzinfo
class myTimeZone(tzinfo):
    """我的时区"""
    def utfoffset(self, dt):
        return timedelta(hours=1)
def myDateHandler(aDateString):
    """u'Sat,  6 Sep 2008 21:16:33 EDT'"""
    _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)')
    day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups()
    month = [
            'JAN', 'FEB', 'MAR', 
            'APR', 'MAY', 'JUN', 
            'JUL', 'AUG', 'SEP', 
            'OCT', 'NOV', 'DEC'
    ].index(month.upper()) + 1
    dt = datetime.datetime(
        int(year), int(month), int(day), 
        int(hour), int(minute), int(second)
    )                   
    # dt = dt - datetime.timedelta(hours=1)
    # dt = dt - dt.tzinfo.utfoffset(myTimeZone())
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, 0)
def main():
    print myDateHandler("Sat,  6 Sep 2008 21:16:33 EDT")
if __name__ == '__main__':
    main()

0
0 Comments

在Python中,我们可以使用datetime对象来处理日期和时间。然而,有时在处理时间时需要考虑时区的问题。在Stack Overflow上有一个关于如何在Python中使用时区的问题,并提供了解决方法。

问题的原因是,使用time.timezone和time.altzone无法满足所有情况。因此,需要找到一个更好的解决方案。为了解决这个问题,可以使用以下代码来获取当前本地时区的偏移量:

import time
offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
offset / 60 / 60 * -1

这段代码的作用是获取当前本地时区与UTC的偏移量(以秒为单位),并将其转换为小时。如果偏移量为正数,表示当前本地时区在UTC的东边;如果偏移量为负数,表示当前本地时区在UTC的西边。然而,由于我们通常希望偏移量为正数表示东边,而负数表示西边,因此需要将结果乘以-1。

需要注意的是,localtime().tm_isdst的值为0表示当前没有启用夏令时(虽然如果一个地区最近更改了夏令时法律,这可能是不正确的)。

这个解决方法可以帮助我们在Python中正确处理时区的问题。

0
0 Comments

问题出现的原因是Python标准库不包含时区信息,因为时区数据的更新速度比Python快得多。因此,需要使用第三方模块来处理时区信息,通常选择的是pytz模块。

解决方法是使用pytz模块来处理时区信息。可以在Python中安装pytz模块,然后使用它来处理datetime对象的时区。

以下是解决方法的代码示例:

import pytz
from datetime import datetime
# 创建一个带有时区信息的datetime对象
dt = datetime(2022, 1, 1, tzinfo=pytz.timezone('America/New_York'))
print(dt)
# 将datetime对象转换为其他时区的时间
dt_utc = dt.astimezone(pytz.utc)
print(dt_utc)
# 将datetime对象转换为本地时间
dt_local = dt.astimezone(pytz.timezone('Asia/Shanghai'))
print(dt_local)

上述代码中,通过使用pytz模块的timezone方法来创建带有时区信息的datetime对象。然后使用astimezone方法来将datetime对象转换为其他时区的时间。

需要注意的是,时区信息需要以字符串的形式传递给pytz.timezone方法,可以通过pytz模块提供的时区列表来选择合适的时区。

使用pytz模块可以很方便地处理datetime对象的时区信息,从而使得Python可以正确地处理不同时区的时间。

0
0 Comments

在Python中,如果要在datetime对象中使用时区信息,建议使用babelpytz库。在处理时间区域时,保持datetime对象的内部数据是无时区的,并且使用UTC时间,在进行格式化时再转换为所需的时区。之所以建议使用无时区的datetime对象,是因为很多库和数据库适配器对时区的概念并不了解。

babelpytz的链接分别是:babel.pocoo.orgpytz。请注意,babel是建立在pytz之上的。

有人可能觉得“无时区和UTC时间”是一种矛盾的说法。事实上,无时区的datetime对象并不包含时区信息,你可以将其解释为任何时区的时间(换句话说,它是模糊的),包括UTC时间。例如,你可以将2008-09-22 20:59:00视为UTC时间(它实际上是2008-09-22 13:59:00 PDT-0700)。

0