【问题标题】:How to get UTC time in Python?如何在 Python 中获取 UTC 时间?
【发布时间】:2013-04-03 03:30:36
【问题描述】:

我在 StackExchange 上搜索了一堆解决方案,但没有什么能完全满足我的需要。在 JavaScript 中,我使用以下方法计算自 1970 年 1 月 1 日以来的 UTC 时间:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

等效的 Python 代码是什么?

【问题讨论】:

标签: python datetime


【解决方案1】:

为什么所有回复都是基于日期时间而不是时间? 我认为是简单的方法!

import time
nowgmt = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
print(nowgmt)

【讨论】:

  • nowgmt 将是一个字符串,它不如拥有一个日期时间对象灵活
【解决方案2】:

您可以使用 datetime 库来获取 UTC 时间,甚至是本地时间。

import datetime

utc_time = datetime.datetime.utcnow() 
print(utc_time.strftime('%Y%m%d %H%M%S'))

【讨论】:

    【解决方案3】:

    仅简单的标准库。与datetime.utcnow() 不同,提供可感知时区的日期时间。

    from datetime import datetime,timezone
    now_utc = datetime.now(timezone.utc)
    

    【讨论】:

    • 根据 Python 3 文档,这是推荐的方法。
    • 干净简单!应该是首选方式。
    • @Marry35 是的,这应该是现在的首选方式。首次提出问题时,timezone.utc 不存在。
    • 如果你更喜欢本地时间(例如为了更方便地显示给用户)但仍然是时区安全的,你可以使用datetime.now().astimezone()
    【解决方案4】:

    零外部依赖的时区感知:

    from datetime import datetime, timezone
    
    def utc_now():
        return datetime.utcnow().replace(tzinfo=timezone.utc)
    

    【讨论】:

    • 为了以zulu格式打印,这是要走的路datetime.utcnow().replace(tzinfo=timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
    【解决方案5】:
    import datetime
    import pytz
    
    # datetime object with timezone awareness:
    datetime.datetime.now(tz=pytz.utc)
    
    # seconds from epoch:
    datetime.datetime.now(tz=pytz.utc).timestamp() 
    
    # ms from epoch:
    int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 
    

    【讨论】:

      【解决方案6】:

      您已经可以从 datetime.datetime 使用 strftime 方法导出到时间戳。按照您的功能示例:

      import datetime
      def UtcNow():
          now = datetime.datetime.utcnow()
          return int(now.strftime("%s"))
      

      如果您想要微秒,则需要更改导出字符串并强制转换为浮点数,例如:return float(now.strftime("%s.%f"))

      【讨论】:

      • 能直接得到数字的情况下,转成字符串再转回数字有什么意义?
      • 重点是你可能想要改变函数的内容,因此最好坚持使用 datetime 对象,而不是使用time.time(),你也可以使用 time.mktime(now.timetuple( )) 直接转换为 int。无论如何,对于这个简单的案例time.time() 也是一个有效的选项。我觉得奇怪的是,通过 timedelta 来查找秒数。
      • 请注意,strftime("%s") 依赖于平台,不适用于 Windows。 (至少在 Windows 10 上不适合我)。
      【解决方案7】:

      以最接近您的原件的形式:

      import datetime
      
      def UtcNow():
          now = datetime.datetime.utcnow()
          return now
      

      如果您需要知道从 1970-01-01 开始的秒数,而不是原生 Python datetime,请改用:

      return (now - datetime.datetime(1970, 1, 1)).total_seconds()
      

      Python 的命名约定与您在 Javascript 中可能使用的命名约定不一致,请参阅 PEP 8。此外,一个简单地返回另一个函数结果的函数是相当愚蠢的。如果只是为了使其更易于访问,您可以通过简单地分配来为函数创建另一个名称。上面的第一个例子可以替换为:

      utc_now = datetime.datetime.utcnow
      

      【讨论】:

      • 我更喜欢您的回答,而不是上面评分较高的回答。感谢您在这里的深度。
      • 也许您应该考虑将 UtcNow() 包装在另一个函数中。这太简单了。也不要使用下划线。 PEP 8 太无聊了……
      • 绝对不需要写一个函数来返回一个简单的单行... datetime.datetime.utcnow()
      • @cpreid 我的习惯是写出接近问题中给出的代码格式的答案。我觉得这有助于理解。
      • UtcNow = datetime.datetime.utcnow(函数是 Python 中的一等公民——你不需要在这里创建一个新函数,用不同的名字来调用它)。
      【解决方案8】:

      试试这个使用datetime.utcnow()的代码:

      from datetime import datetime
      datetime.utcnow()
      

      当您需要计算两个日期之间花费的时间时,您只需减去结束日期和开始日期即可。这种减法的结果是timedelta object.

      来自 python 文档:

      class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
      

      这意味着默认情况下,您可以获得其定义中提到的任何字段 - 天、秒、微秒、毫秒、分钟、小时、周。 timedelta 实例也有 total_seconds() 方法:

      返回持续时间中包含的总秒数。 等价于 (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10*6) / 10*6 在启用真除法的情况下计算。

      【讨论】:

      • datetime.utcnow() 可能令人讨厌的惊喜是它不返回时区感知对象,尽管有名称。在我看来,这是一个大问题,这就是为什么我更喜欢下面的答案。请参阅“没有时区的日期时间对象应被视为应用程序中的“错误”。” julien.danjou.info/python-and-timezones
      • 所谓天真的日期时间对象(即没有设置时区信息)的概念确实有一个目的:我希望我的闹钟每天在 06:00:00 响起,无论在哪里我的世界。它还允许在说计算机游戏中使用“虚拟时钟”:在我的幻想世界中现在是下午 5 点。在 datetime 对象上强制使用时区会很尴尬,尤其是使用 timedelta 算术。
      猜你喜欢
      • 2019-06-05
      • 1970-01-01
      • 2012-04-03
      • 2021-03-12
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      相关资源
      最近更新 更多