代码之家  ›  专栏  ›  技术社区  ›  Elias Zamaria

如何将Python datetime对象转换为UTC?

  •  41
  • Elias Zamaria  · 技术社区  · 16 年前

    我试过这样的方法:

    from datetime import datetime, timedelta
    
    now = datetime.now()
    fiveMinutesLater = datetime.now() + timedelta(minutes=5)
    fiveMinutesLaterUtc = ???
    

    时间或日期时间模块中的任何内容看起来都帮不了我。似乎我可以通过3或4个函数传递datetime对象来完成,但是我想知道是否有更简单的方法。

    我宁愿不使用第三方模块,但我可以,如果它是唯一合理的选择。

    8 回复  |  直到 5 年前
        1
  •  40
  •   Flimm D. Ben Knoble    5 年前

    >>> from datetime import datetime, timedelta
    >>> datetime.utcnow()
    datetime.datetime(2021, 1, 26, 15, 41, 52, 441598)
    >>> datetime.utcnow() + timedelta(minutes=5)
    datetime.datetime(2021, 1, 26, 15, 46, 52, 441598)
    

    如果希望使用时区感知的datetime对象,请在Python 3.2或更高版本中运行此命令:

    >>> from datetime import datetime, timezone
    >>> datetime.now(timezone.utc)
    datetime.datetime(2021, 1, 26, 15, 43, 54, 379421, tzinfo=datetime.timezone.utc)
    
        2
  •  11
  •   Amber    16 年前
        3
  •  6
  •   ishmael    15 年前

    对于在这里寻找将datetime对象转换为UNIX epoch以来的UTC秒的方法的人:

    import time
    import datetime
    
    t = datetime.datetime.now()
    utc_seconds = time.mktime(t.timetuple())
    
        4
  •  3
  •   Carlos A. Ibarra    6 年前

    使用以下选项:

    from datetime import timezone
    utc_datetime = local_datetime.astimezone().astimezone(timezone.utc).replace(tzinfo=None)
    

    假设naivedatetime对象具有本地datetime,可以使用以下方法调用序列将其转换为表示相同UTC时间的naiveutc datetime(用python3.6.3测试)。

    1. astimezone()添加本地时区,使其不再幼稚。
    2. astimezone(timezone.utc)将其从本地转换为utc。

    例子:

    >>> local_datetime = datetime.now()
    >>> local_datetime
    datetime.datetime(2019, 12, 14, 10, 30, 37, 91818)
    >>> local_datetime.astimezone()
    datetime.datetime(2019, 12, 14, 10, 30, 37, 91818, tzinfo=datetime.timezone(datetime.timedelta(-1, 68400), 'Eastern Standard Time'))
    >>> local_datetime.astimezone().astimezone(timezone.utc)
    datetime.datetime(2019, 12, 14, 15, 30, 37, 91818, tzinfo=datetime.timezone.utc)
    >>> local_datetime.astimezone().astimezone(timezone.utc).replace(tzinfo=None)
    datetime.datetime(2019, 12, 14, 15, 30, 37, 91818)
    

    在版本3.6中发生了更改:现在可以调用astimezone()方法

        5
  •  2
  •   Elias Zamaria    16 年前

    我找到了一种方法来获取当前时间,向其中添加timedelta对象,将结果转换为UTC,并在RFC 2822中输出:

    time.strftime("%a, %d-%b-%Y %H:%M:%S GMT",
        time.gmtime(time.time() + datetime.timedelta(minutes=5).seconds))
    

    编辑: timedelta.total_seconds() 86400*timedelta.days + timedelta.seconds . 我还没有真正尝试过这个,所以我不是100%确定它是否会工作。

        6
  •  2
  •   jfs    11 年前

    这里有一个stdlib解决方案(没有第三方模块),它可以在python2和python3上工作。

    要获取RFC 2822格式的当前UTC时间:

    >>> from email.utils import formatdate
    >>> formatdate(usegmt=True)
    'Fri, 27 Mar 2015 08:29:20 GMT'
    

    要获得未来5分钟的UTC时间:

    #!/usr/bin/env python
    import time
    from email.utils import formatdate
    
    print(formatdate(time.time() + 300, usegmt=True)) # 5 minutes into the future
    # -> Fri, 27 Mar 2015 08:34:20 GMT
    
        7
  •  1
  •   GeekTantra    16 年前

    您可以在email.Utils模块中使用formatdate方法,如下所示

    >>> from email.Utils import formatdate
    >>> print formatdate()
    Sun, 25 Jul 2010 04:02:52 -0000
    

    以上是RFC2822格式的日期时间。默认情况下,它返回UTC时间,但如果需要本地时间,可以调用formatdate(localtime=True)。

    更多信息请查看 http://docs.python.org/library/email.mime.html#module-email.util

        8
  •  1
  •   ElaineN    14 年前

    from time import mktime
    from datetime import datetime
    
    mktime(datetime.utctimetuple(datetime.strptime("20110830_1117","%Y%m%d_%H%M")))
    
        9
  •  0
  •   DmitrySemenov    11 年前

    解决方案 具有 Delorean lib

    >>> import datetime
    >>> import delorean
    >>> dt = datetime.datetime.now()
    >>> dl = delorean.Delorean(dt, timezone='US/Pacific')
    >>> dl.shift('UTC')
    Delorean(datetime=2015-03-27 03:12:42.674591+00:00, timezone=UTC)
    
    >>> dl.shift('UTC').datetime
    datetime.datetime(2015, 3, 27, 3, 12, 42, 674591, tzinfo=<UTC>)
    
    >>> dl.shift('EST').datetime
    datetime.datetime(2015, 3, 26, 22, 12, 42, 674591, tzinfo=<StaticTzInfo 'EST'>)
    

    它允许在不同的时区之间轻松切换日期时间