将unix时间戳字符串转换为可读日期

Ver*_*hon 758 python datetime strftime unix-timestamp

我在Python中有一个表示unix时间戳(即"1284101485")的字符串,我想将其转换为可读日期.当我使用时time.strftime,我得到一个TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
Run Code Online (Sandbox Code Playgroud)

Mic*_*las 1125

使用datetime模块:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
Run Code Online (Sandbox Code Playgroud)

  • 如果本地时区有不同的utc偏移量,`.fromtimestamp()`可能会因过去的日期而失败.您需要一个历史悠久的时区数据库,例如`pytz`模块(或您的操作系统)提供的数据库.或者只使用UTC并使用`.utcfromtimestamp()`. (124认同)
  • @JFSebastian您已经提到过这可能会在几条评论中失败 - 请您详细说明为什么它会在过去的日期/时间内失败?(根据赞成评论,很多人都同意你的观点并认为这很简单)当然,任何unix时间戳都有一个简单的等效日期/时间吗? (9认同)
  • 一个导入点是这需要一个自纪元以来的秒数时间戳; 如果你有毫秒,你必须除以我刚刚发现的1000. (6认同)
  • @ davidhood2采用python无法访问[tz数据库](https://en.wikipedia.org/wiki/Tz_database)(Windows)的系统,将本地时区设置为具有不同UTC偏移量的时区.过去(例如欧洲/莫斯科),从timestamp()调用过去的时间戳(2011-).将结果与使用`pytz`计算的值进行比较.如果不清楚; 问一个单独的Stack Overflow问题. (3认同)
  • @ davidhood2:我发布了[我自己的答案,演示了`pytz`解决方案](http://stackoverflow.com/a/40769643/4279). (3认同)

Dan*_*iel 224

>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
Run Code Online (Sandbox Code Playgroud)

取自http://seehuhn.de/pages/pdate


rka*_*ach 143

投票最多的答案建议使用fromtimestamp,因为它使用本地时区,因此很容易出错.为了避免问题,更好的方法是使用UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')
Run Code Online (Sandbox Code Playgroud)

posix_time是您要转换的Posix纪元时间

  • @alper在这种情况下,可能有一个以毫秒为单位的时间戳;尝试除以 1000。如果时间戳以微秒为单位,则除以 1000000。 (3认同)
  • import datetime,pytz datetime.datetime(1990,1,1,tzinfo = pytz.utc) (2认同)
  • `ValueError:年份 53085 超出范围` (2认同)

Joh*_*ooy 71

>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'
Run Code Online (Sandbox Code Playgroud)

  • 如果本地时区有不同的utc偏移量,`time.ctime()`和`time.localtime()`可能会因过去的日期而失败.您需要一个历史悠久的时区数据库,例如`pytz`模块(或您的操作系统)提供的数据库.或者只使用UTC并使用`time.gmtime()`.`datetime`可能提供更宽的日期范围,因此`datetime.utcfromtimestamp()`可以用来代替`time`函数. (9认同)

jfs*_*jfs 59

有两个部分:

  1. 将unix时间戳("自纪元以来的秒数")转换为本地时间
  2. 以所需格式显示本地时间.

即使本地时区过去具有不同的utc偏移并且python无法访问tz数据库,也可以通过便携式获取本地时间的方法是使用pytz时区:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)
Run Code Online (Sandbox Code Playgroud)

要显示它,您可以使用系统支持的任何时间格式,例如:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format
Run Code Online (Sandbox Code Playgroud)

如果您不需要当地时间,则可以获得可读的UTC时间:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))
Run Code Online (Sandbox Code Playgroud)

如果您不关心可能影响返回日期的时区问题,或者python是否可以访问系统上的tz数据库:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))
Run Code Online (Sandbox Code Playgroud)

在Python 3上,您可以仅使用stdlib获取时区感知日期时间(如果python无法访问系统上的tz数据库,例如在Windows上,则UTC偏移可能是错误的):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
Run Code Online (Sandbox Code Playgroud)

time模块中的函数是相应C API周围的瘦包装器,因此它们可能比相应的datetime方法更不便携,否则您也可以使用它们:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  
Run Code Online (Sandbox Code Playgroud)


Con*_*ngo 57

在 Python 3.6+ 中:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")
Run Code Online (Sandbox Code Playgroud)

输出(UTC)

2020-01-15 19:51:41
Run Code Online (Sandbox Code Playgroud)

解释

奖金

要将日期保存为字符串然后打印它,请使用以下命令:

my_date = f"{value:%Y-%m-%d %H:%M:%S}"
print(my_date)
Run Code Online (Sandbox Code Playgroud)

  • 输出是***不是UTC***而是本地时间,除非您在“fromtimestamp”中设置“tz”参数,例如“datetime.timezone.utc”。 (2认同)

Jar*_*ows 34

对于来自UNIX时间戳的人类可读时间戳,我之前在脚本中使用过它:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")
Run Code Online (Sandbox Code Playgroud)

输出:

'2012年12月26日'


Nic*_*ick 24

你可以像这样转换当前时间

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'
Run Code Online (Sandbox Code Playgroud)

将字符串中的日期转换为不同的格式.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013
Run Code Online (Sandbox Code Playgroud)


小智 22

除了使用time/datetime包之外,pandas还可以用来解决同样的问题.这就是我们如何使用pandas时间戳转换为可读日期:

时间戳可以采用两种格式:

  1. 13位(毫秒) - 要将毫秒转换日期,请使用:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 10位数(秒) - 要将转换为日期,请使用:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
    
    Run Code Online (Sandbox Code Playgroud)

  • 看来 pandas 又赢了 - 该模块在所有方面都很棒 (2认同)

Ris*_*ani 18

timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

从时间戳开始随时间获取可读日期,您也可以更改日期格式.

  • 此答案对[this](/sf/answers/1510511061/)答案有什么作用? (5认同)

MrF*_*pes 9

请注意,这utcfromtimestamp可能会导致意外结果,因为它返回一个简单的 datetime 对象。Python 将原始日期时间视为本地时间- 而 UNIX 时间是指 UTC。

可以通过在 中设置tz参数来避免这种歧义fromtimestamp

from datetime import datetime, timezone

dtobj = datetime.fromtimestamp(1284101485, timezone.utc)

>>> print(repr(dtobj))
datetime.datetime(2010, 9, 10, 6, 51, 25, tzinfo=datetime.timezone.utc)
Run Code Online (Sandbox Code Playgroud)

现在您可以格式化为字符串,例如符合 ISO8601 的格式:

>>> print(dtobj.isoformat(timespec='milliseconds').replace('+00:00', 'Z'))
2010-09-10T06:51:25.000Z
Run Code Online (Sandbox Code Playgroud)


Nic*_*sai 9

使用datetime.strftime(format)

from datetime import datetime
unixtime = int('1284101485')

# Print with local time
print(datetime.fromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))

# Print with UTC time
print(datetime.utcfromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))
Run Code Online (Sandbox Code Playgroud)


小智 7

使用以下代码,希望它能解决您的问题。

import datetime as dt

print(dt.datetime.fromtimestamp(int("1284101485")).strftime('%Y-%m-%d %H:%M:%S'))
Run Code Online (Sandbox Code Playgroud)

  • 添加一个解释,为什么此代码可以解决问题以改进您的答案。 (2认同)

its*_*uns 6

import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
Run Code Online (Sandbox Code Playgroud)


小智 6

可以使用gmtime和format函数完成此操作的另一种方法;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))
Run Code Online (Sandbox Code Playgroud)

输出: 2018-10-4 11:57:44