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

时间:2010-09-10 06:56:59

标签: python datetime unix-timestamp strftime

我在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

18 个答案:

答案 0 :(得分:1054)

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

答案 1 :(得分:210)

>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

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

答案 2 :(得分:139)

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

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

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

答案 3 :(得分:70)

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

答案 4 :(得分:56)

分为两部分:

  1. 将unix时间戳(“自纪元以来的秒数”)转换为本地时间
  2. 以所需格式显示当地时间。
  3. 即使本地时区过去具有不同的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))  
    

答案 5 :(得分:42)

在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

说明

奖金

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

my_date = f"{value:%Y-%m-%d %H:%M:%S}"
print(my_date)

答案 6 :(得分:34)

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

import os, datetime

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

输出:

&#39; 2012年12月26日&#39;

答案 7 :(得分:24)

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

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

答案 8 :(得分:16)

除了使用时间/日期时间包之外, 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'
    

答案 9 :(得分:9)

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

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

答案 10 :(得分:4)

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

答案 11 :(得分:3)

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

import datetime as dt

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

答案 12 :(得分:2)

我刚刚成功使用:

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

答案 13 :(得分:2)

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

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

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

答案 14 :(得分:1)

如果您正在处理数据框并且想要 series cannot be converted to class int 错误。使用下面的代码。

new_df= pd.to_datetime(df_new['time'], unit='s')

答案 15 :(得分:0)

快速而肮脏的一个班轮:

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

&#39; 2013-5-5-1-9-43&#39;

答案 16 :(得分:0)

您可以使用easy_date轻松实现:

 toolbar = (Toolbar) findViewById(R.id.tool_bar_org);
 toolbar.getbackgroud().setAlpha(0);
 setSupportActionBar(toolbar);

答案 17 :(得分:0)

请注意,utcfromtimestamp is confusing会由于生成的朴素datetime对象而导致意外结果。最好明确一些,并在tz中设置fromtimestamp参数:

from datetime import datetime, timezone

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

print(dtobj.isoformat())
print(repr(dtobj))
# 2010-09-10T06:51:25+00:00
# datetime.datetime(2010, 9, 10, 6, 51, 25, tzinfo=datetime.timezone.utc)

未指定时区(tz) 将导致 天真日期时间 代表 本地时间 -UNIX时间是指UTC。