首页 文章

使用strftime将python datetime转换为epoch

提问于
浏览
157

我有一段时间在UTC,从那里我想要自纪元以来的秒数 .

我使用strftime将其转换为秒数 . 以2012年4月1日为例 .

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'

2012年4月1日UTC的纪元是1333238400但是这个上面返回1333234800,相差1小时 .

所以看起来strftime正在考虑我的系统时间并在某个地方应用时区转换 . 我以为datetime纯粹是天真的?

我怎么能绕过那个?如果可能的话,避免导入其他库,除非标准 . (我有可移植性问题) .

9 回答

  • 89

    如果你想将python日期时间转换为epoch以来的秒数,你可以明确地做到:

    >>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
    1333238400.0
    

    在Python 3.3中,您可以使用timestamp()代替:

    >>> datetime.datetime(2012,4,1,0,0).timestamp()
    1333234800.0
    

    Why you should not use datetime.strftime('%s')

    Python实际上不支持%s作为strftime的参数(如果你在http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior检查它's not in the list), the only reason it'的工作是因为Python将信息传递给你的系统的strftime,它使用你的本地时区 .

    >>> datetime.datetime(2012,04,01,0,0).strftime('%s')
    '1333234800'
    
  • 0

    我和Timezones等有严重的问题 . Python处理所有碰巧相当令人困惑的方式(对我而言) . 使用日历模块似乎工作正常(请参阅链接1234) .

    >>> import datetime
    >>> import calendar
    >>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
    >>> calendar.timegm(aprilFirst.timetuple())
    1333238400
    
  • 31
    import time
    from datetime import datetime
    now = datetime.now()
    
    time.mktime(now.timetuple())
    
  • -1
    import time
    from datetime import datetime
    now = datetime.now()
    
    # same as above except keeps microseconds
    time.mktime(now.timetuple()) + now.microsecond * 1e-6
    

    (对不起,它不会让我对现有答案发表评论)

  • 0

    这适用于Python 2和3:

    >>> import time
    >>> import calendar
    >>> calendar.timegm(time.gmtime())
    1504917998
    

    刚刚关注官方文档... https://docs.python.org/2/library/time.html#module-time

  • 298

    如果你只需要unix / epoch时间的时间戳,这一行就可以了:

    created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
    >>> created_timestamp
    1522942073L
    

    并且仅依赖于 datetime 在python2和python3中工作

  • 2

    对于明确的与时区无关的解决方案,请使用pytz库 .

    import datetime
    import pytz
    
    pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()
    

    输出(浮点):1333238400.0

  • 14

    介绍pendulum,这是一个第三方 datetime 库,它使日期工作更加人性化 .

    要检索特定日期的时间戳,请使用

    import pendulum as pm
    pm.datetime(2012, 4, 1).timestamp()
    # 1333238400.0
    

    默认时区是 UTC ,但您可以使用 tz 参数更改此值:

    pm.datetime(2012, 4, 1, tz='Asia/Kolkata').timestamp()
    # 1333218600.0
    

    要检索此确切时刻的时间戳,请使用 pendulum.now()

    pm.now().timestamp()
    # 1553667373.080048
    

    请注意, now() 是时区感知的 .

    pm.now().timezone_name  # My current timezone.
    # 'America/Los_Angeles'
    
  • 2

    在Python 3.7中

    以date.isoformat()和datetime.isoformat()发出的格式之一返回与date_string对应的日期时间 . 具体来说,此函数支持格式为YYYY-MM-DD [* HH [:MM [:SS [.fff [fff]]]] [HH:MM [:SS [.ffffff]]]]的字符串,其中*可以匹配任何单个字符 .

    https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

相关问题