如何在python中将时区添加到原始datetime实例中

如何在python中将时区添加到原始datetime实例中,python,datetime,timezone,pytz,Python,Datetime,Timezone,Pytz,我有一个没有时区信息的datetime。我现在正在获取时区信息,希望将时区添加到现有的datetime实例中,我该怎么做 d = datetime.datetime.now() tz = pytz.timezone('Asia/Taipei') 如何将时区信息tz添加到datetimea使用tz.localize(d)来本地化实例。从: 第一种方法是使用pytz库提供的localize()方法。这用于本地化原始日期时间(没有时区信息的日期时间): 如果不使用tz.localize(),而是使用

我有一个没有时区信息的
datetime
。我现在正在获取时区信息,希望将时区添加到现有的datetime实例中,我该怎么做

d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')
如何将时区信息
tz
添加到datetime
a

使用
tz.localize(d)
来本地化实例。从:

第一种方法是使用pytz库提供的localize()方法。这用于本地化原始日期时间(没有时区信息的日期时间):

如果不使用
tz.localize()
,而是使用
datetime.replace()
,那么很可能会使用历史偏移量
tz.localize()
将选择给定日期有效的正确偏移量。例如,美国东部时区DST开始和结束日期随时间而变化

当您试图本地化一个不明确的日期时间值时,因为它跨越了从夏季到冬季的过渡期,反之亦然,将查询时区,以查看生成的datetime对象是否应该有
.dst()
返回True或False。您可以使用
.localize()
isdst
关键字参数覆盖时区的默认值:

甚至通过设置
isdst=None
来完全关闭选项。在这种情况下,或者在极少数情况下,没有时区的默认设置,不明确的datetime值将导致引发
不明确的错误
异常。
is_dst
标志仅用于不明确的日期时间值,否则将被忽略

要返回到另一种方式,请使用
.replace(tzinfo=None)
将时区感知对象返回到原始对象:

使用
tz.localize(d)
对实例进行本地化。从:

第一种方法是使用pytz库提供的localize()方法。这用于本地化原始日期时间(没有时区信息的日期时间):

如果不使用
tz.localize()
,而是使用
datetime.replace()
,那么很可能会使用历史偏移量
tz.localize()
将选择给定日期有效的正确偏移量。例如,美国东部时区DST开始和结束日期随时间而变化

当您试图本地化一个不明确的日期时间值时,因为它跨越了从夏季到冬季的过渡期,反之亦然,将查询时区,以查看生成的datetime对象是否应该有
.dst()
返回True或False。您可以使用
.localize()
isdst
关键字参数覆盖时区的默认值:

甚至通过设置
isdst=None
来完全关闭选项。在这种情况下,或者在极少数情况下,没有时区的默认设置,不明确的datetime值将导致引发
不明确的错误
异常。
is_dst
标志仅用于不明确的日期时间值,否则将被忽略

要返回到另一种方式,请使用
.replace(tzinfo=None)
将时区感知对象返回到原始对象:


如果您知道您的原始日期时间是在您试图添加到它的时区中“测量”的,那么您可以(但可能不应该)使用
replace
,而不是
localize

# d = datetime.datetime.now()
# tz = pytz.timezone('Asia/Taipei')
d = d.replace(tzinfo=tz)
我可以想象有两次这可能是有意义的(第二次发生在我身上):

  • 您的服务器区域设置被设置为不正确的时区,您正试图通过让
    datetime
    实例知道这个不正确的时区来纠正它(可能以后会将其定位到“正确”的时区,以便now()的值与您比较它的其他时间相匹配(可能是您的手表)
  • 您希望使用时区(tzinfo)属性“标记”一个
    time
    实例(NOTa
    datetime
    ),以便以后可以使用该属性来形成一个完整的
    datetime
    实例

  • 如果您知道您的原始日期时间是在您试图添加到它的时区中“测量”的,那么您可以(但可能不应该)使用
    replace
    ,而不是
    localize

    # d = datetime.datetime.now()
    # tz = pytz.timezone('Asia/Taipei')
    d = d.replace(tzinfo=tz)
    
    我可以想象有两次这可能是有意义的(第二次发生在我身上):

  • 您的服务器区域设置被设置为不正确的时区,您正试图通过让
    datetime
    实例知道这个不正确的时区来纠正它(可能以后会将其定位到“正确”的时区,以便now()的值与您比较它的其他时间相匹配(可能是您的手表)
  • 您希望使用时区(tzinfo)属性“标记”一个
    time
    实例(NOTa
    datetime
    ),以便以后可以使用该属性来形成一个完整的
    datetime
    实例

  • 有没有什么方便的方法可以从包含tzinfo的
    datetime
    中获取原始的
    datetime
    ?@waitingkuo:call
    .replace(tzinfo=None)
    datetime
    对象上的
    。返回值是一个简单的
    datetime
    实例。
    is_dst
    参数值得一提,用于解决不明确的时间或断言当时没有dst转换。@hobs:我不希望本地化适用于
    time
    对象,不,因为本地化需要date无法正确执行其工作。时区偏移对于时间组件来说毫无意义,您缺少DST和历史上下文的信息。@hobs:使用
    是错误的。请将()
    替换为可能具有多个utc偏移的
    pytz
    时区(许多时区都有)。默认的tzinfo对象通常对应于LMT(太阳时)在大多数情况下,这不是你想要的(我认为默认值背后的理由是帮助揭示不正确的
    .replace()
    用法)。有没有方便的方法来获取原始的
    日期时间
    
    naivedt = awaredt.replace(tzinfo=None)
    
    # d = datetime.datetime.now()
    # tz = pytz.timezone('Asia/Taipei')
    d = d.replace(tzinfo=tz)