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


825

我有一个表示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

1
链接到也转换回问题的链接:stackoverflow.com/q/19801727/3273031
肮脏的

Answers:


1209

使用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'))

131
.fromtimestamp()如果本地时区具有不同的utc偏移量,则对于过去的日期可能会失败。您需要一个历史时区数据库,例如由pytz模块(或您的操作系统)提供的数据库。或者只是在UTC工作并使用.utcfromtimestamp()
jfs

9
@JFSebastian您已经在几条评论中提到此操作可能会失败-请您详细说明为什么它在过去的日期/时间失败了吗?(根据支持者的判断,很多人都同意您的观点,这很简单。)当然,任何unix时间戳都具有简单的等效日期/时间吗?
davidhood2 '16

3
@ davidhood2使用python无法访问tz数据库的系统(Windows),将您的本地时区设置为过去具有不同UTC偏移量的时区(例如Europe / Moscow),使用过去的时间戳调用fromtimestamp() (2011-)。将结果与使用计算的值进行比较pytz。如果不清楚;问一个单独的堆栈溢出问题。
jfs

3
@ davidhood2:我已经发布了自己的答案来演示pytz解决方案
jfs

6
导入点是自该时间点起以秒为单位的时间戳记;如果您有毫秒,则必须除以我刚刚发现的1000。
wordsforthewise


145

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

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

其中posix_time是要转换的Posix纪元时间


2
导入datetime,pytz datetime.datetime(1990,1,1,tzinfo = pytz.utc)
y.selivonchyk

76
>>> 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'

10
time.ctime()time.localtime()如果本地时区有不同的UTC偏移量可能会失败过去的日期。您需要一个历史时区数据库,例如由pytz模块(或您的操作系统)提供的数据库。或者只是在UTC工作并使用time.gmtime()datetime可能提供更大的日期范围,因此datetime.utcfromtimestamp()可以代替time功能使用。
jfs

66

有两个部分:

  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)

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

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

如果您不需要当地时间,请改为获取可读的UTC时间:

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

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

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

在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)"))

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))  

如果您关心本地时间,它应该是投票最多的答案。
azzamsa

36

为了使UNIX时间戳易于理解,我以前在脚本中使用过它:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

输出:

'2012年12月26日'


25

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

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

将字符串中的日期转换为其他格式。

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

24

除了使用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'
  2. 10位(秒)-要将转换为日期,请使用:

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

大熊猫另一个胜利似乎-模块是梦幻般的一切
VaidøtasIvøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

您还可以从时间戳获取带有时间的可读日期,也可以更改日期格式。


5
这是什么答案添加到这个答案吗?
kocica

1
请添加与当地时区假设问题相关的警告。编程的最佳做法是将时间戳存储为UTC时间而不是本地时间戳。但是如果本地时区不是UTC,则上面的示例将返回错误的时间。
蒂莫西·奎因

20

在Python 3.6+中:

import datetime

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

输出:

2020-01-15 19:51:41

说明:


6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

6

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

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

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


1

我刚刚成功使用过:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

0

快速又脏的一个衬里:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'


3
或更简洁地说:'-'。join(map(str,datetime.datetime.now()。timetuple()[:6]))
Jelle Zijlstra

2
@JelleZijlstra嗯,我更喜欢生成器表达式而不是map。
爆炸

4
'2013-5-5-1-9-43'是什么样的日期格式?我从未在任何地方看到此格式作为日期/时间的有效表示形式。
madoki '16

您能详细说明什么使它成为无效表示@madoki吗?你是说不规范吗?与大多数其他答案相比,它的主要优点是能够将其包含在文件或目录路径中,因为空格和冒号不在标准的UNIX目录字符集中。参见例如stackoverflow.com/a/458001/209246
eqzx

0

您可以使用easy_date使其变得容易:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
每个程序都有自己的日期和时间转换器。一个人永远不必为此使用mod / framework
JosFabre

strptime而且strftime不是很直观...甚至都不可读...但是我理解并尊重您的意见
Raphael Amoedo 2015年

4
认为“不必使用”是错误的。它取决于语言和内置库的质量。Javascript具有moments.js和Java具有Joda时间,两者都比各自内置的日期和时间转换实用程序更受欢迎(以至于Joda时间后来影响了Java 8的更新标准库)。也就是说,除非问题要求好的第三方库,否则最好根据标准库给出答案。
Hejazzman,2015年

我站着纠正@NikosVentouras。我刚刚第一次遇到“ IE中的JS Date行为不同”的问题。所以我最终使用了moment.js
JosFabre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.