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

1113

我有一个字符串表示一个Unix时间戳(例如“1284101485”)在Python中,我想将其转换为可读日期。当我使用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

4
好的,我会尽力以最简洁的方式翻译以下内容:问题描述: 我有一个字符串,其中包含多个单词,每个单词都以大写字母开头。我需要将这些单词转换为小写,并在它们之间添加下划线。原字符串示例:TheQuickBrownFox 期望输出结果:the_quick_brown_fox解决方案: 使用正则表达式来匹配大写字母并将其替换为相应的小写字母和下划线即可。Python代码示例:import re s = "TheQuickBrownFox" s = re.sub('([A-Z])', r'_\1', s).lower().lstrip('_') print(s)输出结果为:the_quick_brown_fox - slushy
19个回答

12

请注意,utcfromtimestamp 可能会导致 意外结果,因为它返回一个naive datetime对象。Python将naive datetime视为本地时间,而UNIX时间是UTC时间。

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

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)
现在您可以将格式转换为字符串,例如符合ISO8601标准的格式:
>>> print(dtobj.isoformat(timespec='milliseconds').replace('+00:00', 'Z'))
2010-09-10T06:51:25.000Z

9

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

import datetime as dt

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

2
在您的答案中添加解释,说明为什么此代码将解决问题。 - Rachel Gallen

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

7
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

4
如果您正在使用数据框架,并且不想要出现“series cannot be converted to class int”错误,请使用以下代码。
new_df= pd.to_datetime(df_new['time'], unit='s')

1

我刚刚成功地使用了:

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

1
你可以使用 easy_date 来简化操作:
import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
每种编程语言都有自己的日期和时间转换器。我们不应该为此使用模块/框架。请注意,翻译后的内容应保留原意,并尽可能地通俗易懂。 - Jos
1
"strptime" 和 "strftime" 不直观...甚至不易读... 但我理解并尊重你的观点。 - Raphael Amoedo
6
“永远不需要使用”是错误的说法。这取决于语言和内置库的质量。比如Javascript有moments.js,Java有Joda time,它们都比各自内置的日期时间转换工具更受欢迎(以至于Joda time后来影响了Java 8的更新标准库)。但是,除非问题要求使用第三方库,否则最好基于标准库给出答案。 - Hejazzman
1
我向@NikosVentouras道歉。我第一次遇到了“IE中的JS日期行为不同”的问题。所以我最终使用了moment.js。 - Jos

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。 - crhodes
6
“2013-5-5-1-9-43”这种日期格式是什么?我从未在任何地方见过这种格式作为日期/时间的有效表示。 - madoki
@madoki,您能详细说明这是什么样的无效表示吗?您是指非标准的吗?它比大多数其他答案的主要优点在于可以将其包含在文件或目录路径中,因为空格和冒号不在标准Unix目录字符集中。例如,请参见https://dev59.com/oXRB5IYBdhLWcg3w9Lvn#458001 - eqzx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接