【问题标题】:Python time zone conversion from UTC to EST从 UTC 到 EST 的 Python 时区转换
【发布时间】:2021-11-10 05:44:35
【问题描述】:

我在 python 中有以下列表。

[['File_1','2021-09-09 07:05:10'],['File_2','2021-09-08 08:05:11']]

上面的时间戳是一个UTC时区的字符串。我想将其转换为 EST 时区。

我尝试使用 pytz 包使用

datetime.strptime(timestamp,'%Y-%m-%d %H:%M:%S').astimezone(pytz.timezone('US/Eastern')) 

但它给了我这样的结果

['File_1',datetime.datetime(2021,09,03,4,20,5)].

日期时间格式不符合预期。

【问题讨论】:

  • 您期望的输出格式是什么?
  • 与输入格式相同,但时区应从 UTC 更改为 EST
  • 日期时间作为数据结构没有格式。如果您需要像“2021-09-08 08:05:11”这样的字符串,它是一个以某种格式表示日期/时间的字符串。旁注:如果日期/时间字符串的时间来自某个时区,则至少应提供 UTC 偏移量以及日期和时间,否则很容易被误解为例如 UTC。

标签: python datetime timezone


【解决方案1】:

您需要先设置 UTC,然后转换为所需的 tz:

from datetime import datetime, timezone
from zoneinfo import ZoneInfo # Python 3.9+ standard lib

l = [['File_1','2021-09-09 07:05:10'],['File_2','2021-09-08 08:05:11']]

out = [[i[0], datetime.fromisoformat(i[1]) # Python 3.7+
                .replace(tzinfo=timezone.utc)
                .astimezone(ZoneInfo("America/New_York"))] for i in l]
       
print(out)
# [['File_1', datetime.datetime(2021, 9, 9, 3, 5, 10, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))], ['File_2', datetime.datetime(2021, 9, 8, 4, 5, 11, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))]]

# with pytz:
import pytz

outp = [[i[0], datetime.fromisoformat(i[1]) # Python 3.7+
                .replace(tzinfo=timezone.utc)
                .astimezone(pytz.timezone("America/New_York"))] for i in l]
print(outp)
# [['File_1', datetime.datetime(2021, 9, 9, 3, 5, 10, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)], ['File_2', datetime.datetime(2021, 9, 8, 4, 5, 11, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)]]

如果您想要一个字符串而不是日期时间对象,请使用 strftime 或更简单的:.isoformat()

【讨论】:

  • OP 不是要求输出像 '2021-09-09 03:05:10' 那样在 str 中而不是对象中吗?
  • @Luke:这对我来说并不完全清楚。但无论如何它都需要设置UTC。格式化为字符串只是另一个方法调用(strftime)
  • 有没有类似zoneinfo的包兼容python 2.7?
  • @Padfoot123 对于 Python 2,您必须使用 pytz。使用 Python 3 标准库 (zoneinfo) 处理时区仍然相对较新。
【解决方案2】:

您可以使用下面的 sn-p 来获得与输入相同格式的输出

from datetime import datetime
import pytz
from pytz import timezone

timestamp = '2021-09-09 07:05:10'
datetime.strptime(timestamp,'%Y-%m-%d %H:%M:%S').astimezone(pytz.timezone('US/Eastern')).strftime("%Y-%m-%d %H:%M:%S")

# Output
'2021-09-09 03:05:10'

如果你想以格式显示时区,你可以使用

datetime.strptime(timestamp,'%Y-%m-%d %H:%M:%S').astimezone(pytz.timezone('US/Eastern')).strftime("%Y-%m-%d %H:%M:%S %Z%z")

# Output
'2021-09-09 03:05:10 EDT-0400'

【讨论】:

  • datetime.strptime(timestamp,'%Y-%m-%d %H:%M:%S') 会给你一个简单的 datetime 对象,Python 将其视为本地时间,这很可能与 UTC 不同 - 因此使用 astimezone 进行转换不会给出预期的结果。跨度>
  • 因为问题是“从 UTC 转换为 EST”,我认为是这样。其他语言把没有指定时区的datetime当作UTC,就可以了。
【解决方案3】:

这是将其转换为 EST 的一种方法

第一。声明列表,并将要转换的日期标识为字符串

list = [['File_1','2021-09-09 07:05:10'],['File_2','2021-09-08 08:05:11']]
date_to_convert = list[1][1]

第二。导入需要的库

import pytz
from datetime import datetime,timezone

第三。将字符串转换为日期时间

d = datetime.fromisoformat(date_to_convert)

第四。将 datetime 时区声明为 utc。

d = date_to_string.replace(tzinfo=timezone.utc)
print(d.isoformat())
# the output for the above: '2021-09-08T08:05:11+00:00'

第五。设置格式并转换为EST

fmt = '%Y-%m-%d %H:%M:%S'
est_date = d.astimezone(pytz.timezone('US/Eastern')).strftime(fmt)
print(est_date)
# the output for the above: '2021-09-08 04:05:11'

【讨论】:

    【解决方案4】:

    使用这种方式记住大写和小写也很重要

    import time
    
    timer = time.strftime("%Y-%m-%d -- %H:%M:%S %p")
    print(timer)
    

    【讨论】:

    • 我认为这不是 OP 所要求的 - 它只是打印当前的当地时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2013-06-16
    • 2021-10-27
    • 2016-07-20
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多