【问题标题】:How to convert GMT time to EST time using Python如何使用 Python 将 GMT 时间转换为 EST 时间
【发布时间】:2012-06-15 11:23:35
【问题描述】:

我想将 GMT 时间转换为 EST 时间并获得时间戳。我尝试了以下但不知道如何设置时区。

time = "Tue, 12 Jun 2012 14:03:10 GMT"
timestamp2 = time.mktime(time.strptime(time, '%a, %d %b %Y %H:%M:%S GMT'))

【问题讨论】:

  • 您发布的代码根本无法运行,因为您将字符串命名为time,然后尝试使用time 包中的一个函数,该函数不再可以通过该名称访问。

标签: python datetime timestamp timezone


【解决方案1】:

标准 Python 中没有内置时区 - 您需要使用其他库。 pytz 是个不错的选择。

>>> gmt = pytz.timezone('GMT')
>>> eastern = pytz.timezone('US/Eastern')
>>> time = "Tue, 12 Jun 2012 14:03:10 GMT"
>>> date = datetime.datetime.strptime(time, '%a, %d %b %Y %H:%M:%S GMT')
>>> date
datetime.datetime(2012, 6, 12, 14, 3, 10)
>>> dategmt = gmt.localize(date)
>>> dategmt
datetime.datetime(2012, 6, 12, 14, 3, 10, tzinfo=<StaticTzInfo 'GMT'>)
>>> dateeastern = dategmt.astimezone(eastern)
>>> dateeastern
datetime.datetime(2012, 6, 12, 10, 3, 10, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

【讨论】:

    【解决方案2】:

    使用pytz

    from datetime import datetime
    from pytz import timezone
    fmt = "%Y-%m-%d %H:%M:%S %Z%z"
    now_time = datetime.now(timezone('US/Eastern'))
    print now_time.strftime(fmt)
    

    【讨论】:

      【解决方案3】:

      使用 Python 3.9,时区处理通过 zoneinfo 模块内置到标准库中(对于较旧的 Python 版本,通过 backports.zoneinfo 使用 zoneinfo)。

      例如:

      from zoneinfo import ZoneInfo
      from datetime import datetime, timezone
      
      time = "Tue, 12 Jun 2012 14:03:10 GMT"
      
      # parse to datetime, using %Z for the time zone abbreviation
      dtobj = datetime.strptime(time, '%a, %d %b %Y %H:%M:%S %Z')
      
      # note that "GMT" (=UTC) is ignored:
      # datetime.datetime(2012, 6, 12, 14, 3, 10)
      
      # ...so let's correct that:
      dtobj = dtobj.replace(tzinfo=timezone.utc)
      # datetime.datetime(2012, 6, 12, 14, 3, 10, tzinfo=datetime.timezone.utc)
      
      # convert to US/Eastern (EST or EDT, depending on time of the year)
      dtobj = dtobj.astimezone(ZoneInfo('US/Eastern'))
      # datetime.datetime(2012, 6, 12, 10, 3, 10, tzinfo=zoneinfo.ZoneInfo(key='US/Eastern'))
      print(dtobj)
      # 2012-06-12 10:03:10-04:00
      

      还有dateutil,其语义相同:

      import dateutil
      # no strptime needed...
      # correctly localizes to GMT (=UTC) directly
      dtobj = dateutil.parser.parse(time) 
      
      dtobj = dtobj.astimezone(dateutil.tz.gettz('US/Eastern'))
      # datetime.datetime(2012, 6, 12, 10, 3, 10, tzinfo=tzfile('US/Eastern'))
      print(dtobj)
      # 2012-06-12 10:03:10-04:00
      

      【讨论】:

      • 感谢您提及backports.zoneinfo,因为我选择了操作系统,所以我被困在 Python 3.8 上。
      【解决方案4】:

      如果是您的本地时区,并且给定时间的时区规则与现在相同,那么您可以使用仅限 stdlib 的解决方案(某些边缘情况除外):

      #!/usr/bin/env python
      from email.utils import parsedate_tz, mktime_tz
      from datetime import datetime
      
      timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT"))
      print(datetime.fromtimestamp(timestamp))
      # -> 2012-06-12 10:03:10
      

      否则,您需要来自历史时区数据库的数据才能获得正确的 UTC 偏移量。 pytz module 提供对the tz database 的访问权限:

      #!/usr/bin/env python
      from email.utils import parsedate_tz, mktime_tz
      from datetime import datetime
      import pytz # $ pip install pytz
      
      timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT"))
      eastern_dt = datetime.fromtimestamp(timestamp, pytz.timezone('America/New_York'))
      print(eastern_dt.strftime('%a, %d %b %Y %H:%M:%S %z (%Z)'))
      # -> Tue, 12 Jun 2012 10:03:10 -0400 (EDT)
      

      注意:POSIX timestamp 在全球范围内都是一样的,也就是说,如果你想找到时间戳,你的本地时区并不重要(除非你的时区是“正确的”类型)。这是convert a utc time to the timestamp的方法。

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 2014-06-25
        • 2015-08-04
        • 1970-01-01
        • 2019-09-23
        • 2021-10-02
        • 1970-01-01
        • 2018-01-08
        • 2013-01-01
        相关资源
        最近更新 更多