如何在Python中获取当前时间


2886

获取当前时间的模块/方法是什么?


请注意,最投票的答案是timezonoe天真的日期时间,而我们看到,在生产环境在世界各地越来越多的服务连接在一起,时区感知日期时间成为所要求的标准
斯瓦沃米尔Lenart

Answers:


3049

采用:

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2009, 1, 6, 15, 8, 24, 78915)

>>> print(datetime.datetime.now())
2009-01-06 15:08:24.789150

而只是时间:

>>> datetime.datetime.now().time()
datetime.time(15, 8, 24, 78915)

>>> print(datetime.datetime.now().time())
15:08:24.789150

请参阅文档以获取更多信息。

要保存输入,可以datetimedatetime模块中导入对象:

>>> from datetime import datetime

然后datetime.从以上所有位置移除引线。


25
如果此答案涵盖了时区(可能以UTC为例),并且可能以time.time()开头,那就太好了。
格雷格·林达尔

4
@Toskan格式不是问题的一部分,因此它不应该是答案的一部分。已经提供了指向该模块更多文档的链接,其中包含诸如格式化之类的内容。
JiyuuSensei

最初的答案是哪个版本的Python?只需datetime.datetime.now()在我的Python 2.7交互式控制台中输入(IronPython尚未更新),就可以得到print()与答案中使用的较新示例相同的行为。我尚未成功复制原始答案显示的内容(datetime.datetime(2009、1、6、15、8、24、78915))。(并不是我真的想要,首选print()行为,但我很好奇。)
RTHarston,

@BobVicktor:Python 2.7、3.7和3.8都为我提供了相同的行为,不确定您所看到的是什么。
哈雷·霍尔科姆

@HarleyHolcombe嗯...也许是IronPython的东西?当我datetime.now()自行输入时,它的打印结果与您的答案显示的一样print(datetime.now())……
RTHarston,

955

您可以使用time.strftime()

>>> from time import gmtime, strftime
>>> strftime("%Y-%m-%d %H:%M:%S", gmtime())
'2009-01-05 22:14:39'

48
比下面@ParaMeterz的答案更好/更糟糕吗?为什么要使用time模块与datetime模块?
弥敦道

3
它不返回我计算机的当前时间。
Saeed

5
这是UTC时间,从日期时间模块不同
航海家

5
@Saeed:使用函数localtime()代替gmtime()来获取您的本地时间。
Jeyekomon

3
@frank请参阅相关的问题datetimetime
Packard CPW

621
from datetime import datetime
datetime.now().strftime('%Y-%m-%d %H:%M:%S')

对于此示例,输出将如下所示: '2013-09-18 11:16:32'

这是strftime指令列表。


456

Harley的答案相似,但使用该str()函数可得到快速n脏的,人类可读的格式:

>>> from datetime import datetime
>>> str(datetime.now())
'2011-05-03 17:45:35.177000'

13
它要求的只是获取当前时间,而不是显示它。
pppery

@ppperry,然后只需为Ray的答案分配一个变量即可,例如:myTime = str(datetime.now())
卢卡斯

2
没有关联; “ str”步骤不在问题范围内
pppery

4
@pppery操作人员也没有说这不是要花费很多时间。op并没有完全说出他们想用时间做什么,那么为什么显示如何将其变成字符串是一件不好的事情呢?大多数答案都谈论从时间开始获取字符串,因此这似乎是一个常见的用例,那么为什么要挑出Ray的答案呢?只是在不知道如何做的情况下花费时间而什么用?您可以打印它,也可以在上面做数学运算,只有几个答案显示了如何在它上面进行数学运算,因此我认为打印/获取字符串是一种常见的用法。;-)(我知道这就是我的目标。)
RTHarston,

1
这个答案有超过440个upvotes的事实表明,未成年人除了字符串的方法有用的人很多。
John

360

如何使用Python获取当前时间?

time模块

time模块提供的功能可以告诉我们时间(自纪元以来的秒数)以及其他实用程序。

import time

Unix时代时间

这是保存数据库时应使用的时间戳格式。它是一个简单的浮点数,可以转换为整数。这对于以秒为单位的算术也很有用,因为它代表自1970年1月1日00:00:00以来的秒数,并且相对于我们接下来要看的其他时间表示,它是记忆光。

>>> time.time()
1424233311.771502

该时间戳记不占leap秒,因此不是线性的-leap秒将被忽略。因此,尽管它不等同于国际UTC标准,但它很接近,因此对于大多数记录保存情况而言,这是相当好的。

但是,这对于人工调度而言并不理想。如果您希望在某个特定时间发生将来的事件,则需要使用可以解析为datetime对象或序列化datetime对象的字符串存储该时间(稍后将对此进行描述)。

time.ctime

您还可以用操作系统首选的方式来表示当前时间(这意味着当您更改系统首选项时,它可以更改,因此请不要像其他人所期望的那样,将其作为所有系统的标准时间) 。这通常是用户友好的,但通常不会导致字符串可以按时间顺序排序:

>>> time.ctime()
'Tue Feb 17 23:21:56 2015'

您还可以通过以下方式将时间戳混合为易于阅读的形式ctime

>>> time.ctime(1424233311.771502)
'Tue Feb 17 23:21:51 2015'

这种转换也不利于保存记录(除非只能由人类解析的文本,并且随着光学字符识别和人工智能的改进,我认为这些案件的数量将会减少)。

datetime 模组

datetime模块在这里也非常有用:

>>> import datetime

datetime.datetime.now

datetime.now是一类方法,它返回当前时间。它使用time.localtime不带时区信息的(如果未提供,否则请参阅下面的了解时区)。它具有在外壳上回显的表示形式(允许您重新创建等效的对象),但是在打印(或强制转换为str)时,它具有人类可读(和几乎ISO)的格式,而词典编排相当于按时间顺序排序:

>>> datetime.datetime.now()
datetime.datetime(2015, 2, 17, 23, 43, 49, 94252)
>>> print(datetime.datetime.now())
2015-02-17 23:43:51.782461

日期时间 utcnow

通过执行以下操作,您可以获取全球标准UTC时间中的datetime对象:

>>> datetime.datetime.utcnow()
datetime.datetime(2015, 2, 18, 4, 53, 28, 394163)
>>> print(datetime.datetime.utcnow())
2015-02-18 04:53:31.783988

UTC是几乎等同于GMT时区的时间标准。(虽然GMT和UTC的夏令时不变,但他们的用户可能会在夏季切换到其他时区,例如英国夏令时。)

datetime时区感知

但是,到目前为止,我们创建的datetime对象都无法轻松转换为各种时区。我们可以使用以下pytz模块解决该问题:

>>> import pytz
>>> then = datetime.datetime.now(pytz.utc)
>>> then
datetime.datetime(2015, 2, 18, 4, 55, 58, 753949, tzinfo=<UTC>)

等效地,在Python 3中,我们有一个timezone带有utc timezone实例的类,它也使对象知道时区(但在没有方便的pytz模块的情况下,转换成另一个时区留给读者练习):

>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2015, 2, 18, 22, 31, 56, 564191, tzinfo=datetime.timezone.utc)

而且我们看到我们可以轻松地从原始utc对象转换为时区。

>>> print(then)
2015-02-18 04:55:58.753949+00:00
>>> print(then.astimezone(pytz.timezone('US/Eastern')))
2015-02-17 23:55:58.753949-05:00

您还可以使用pytztimezone localize方法或通过替换tzinfo属性(使用replace,这是盲目的完成)来使朴素的datetime对象知道的,但是这些方法比最佳实践更多的是不得已而为之:

>>> pytz.utc.localize(datetime.datetime.utcnow())
datetime.datetime(2015, 2, 18, 6, 6, 29, 32285, tzinfo=<UTC>)
>>> datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
datetime.datetime(2015, 2, 18, 6, 9, 30, 728550, tzinfo=<UTC>)

pytz模块使我们能够使datetime对象知道时区,并将时间转换为pytz模块中可用的数百个时区。

人们可以表面上连载这个对象UTC时间和存储在数据库中,但它需要远远更多的内存和比简单地存储Unix纪元的时间,这是我第一次表现出更容易出错。

其他查看时间的方式更容易出错,尤其是在处理可能来自不同时区的数据时。您希望不要将字符串或序列化日期时间对象用于哪个时区。

如果您正在使用Python为用户显示时间,则ctime可以很好地工作,而不是在表中(通常排序不佳),而是在时钟中。但是,我个人建议在Python中使用Unix时间或时区感知UTC datetime对象处理时间时。


133

from time import time

t = time()
  • t -浮点数,适用于时间间隔测量。

Unix和Windows平台有所不同。


我在Windows 10家庭版上的结果是1576095264.2682993-对于Windows,这可能只花几秒钟的时间。
PythonMaster202 '19

101
>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %X +0000", gmtime())
'Tue, 06 Jan 2009 04:54:56 +0000'

以指定格式输出当前GMT。还有一种localtime()方法。

页面有更多详细信息。


69

先前的答案都是不错的建议,但我发现它最容易使用ctime()

In [2]: from time import ctime
In [3]: ctime()
Out[3]: 'Thu Oct 31 11:40:53 2013'

这样可以很好地格式化当前本地时间的字符串表示形式。


OP询问如何获取时间,而不是如何显示时间!
TheTechRobo36414519

58

最快的方法是:

>>> import time
>>> time.strftime("%Y%m%d")
'20130924'

52

如果您需要当前时间作为time对象:

>>> import datetime
>>> now = datetime.datetime.now()
>>> datetime.time(now.hour, now.minute, now.second)
datetime.time(11, 23, 44)

36

.isoformat() 在文档中,但尚未在此处(这与@Ray Vega的答案非常相似):

>>> import datetime
>>> datetime.datetime.now().isoformat()
'2013-06-24T20:35:55.982000'

35

为什么不问美国海军的官方计时器美国海军天文台呢?

import requests
from lxml import html

page = requests.get('http://tycho.usno.navy.mil/cgi-bin/timer.pl')
tree = html.fromstring(page.content)
print(tree.xpath('//html//body//h3//pre/text()')[1])

如果您像我一样住在华盛顿特区,那么延迟可能不会太糟糕...


18
@ C8H10N4O2当您正确地确定其他答案都假定您的计算机已经知道正确的时间时,此答案假设您的计算机已连接到Internet,并且您在美国,并且它们永远不会删除该文件/更改链接。这个答案的假设要多于接受的假设。仍然还是很聪明
sudobangbang

32

使用熊猫来获取当前时间,有点过头了:

import pandas as pd
print(pd.datetime.now())
print(pd.datetime.now().date())
print(pd.datetime.now().year)
print(pd.datetime.now().month)
print(pd.datetime.now().day)
print(pd.datetime.now().hour)
print(pd.datetime.now().minute)
print(pd.datetime.now().second)
print(pd.datetime.now().microsecond)

输出:

2017-09-22 12:44:56.092642
2017-09-22
2017
9
22
12
44
56
92693

28

这就是我最终要进行的工作:

>>>from time import strftime
>>>strftime("%m/%d/%Y %H:%M")
01/09/2015 13:11

此外,该表是选择适当的格式代码得到格式化只是你想要的方式日期(从Python的“日期时间”的文档的必要参考这里)。

strftime格式代码表


2
strftime(time_format)以对应于给定的字符串返回当前本地时间time_format。注意:time.strftime()datetime.strftime()支持不同的指令集,例如Python 2 %z不支持time.strftime()
jfs 2015年

1
使用日期时间而不是时间是否是更好的做法?
克里斯汀·G.

2
许多time模块功能都是对应C函数的薄包装。datetime是更高的级别,通常更便于携带。
jfs 2015年

24

如果您已经在使用numpy,则可以直接使用numpy.datetime64()函数。

import numpy as np
str(np.datetime64('now'))

仅限日期:

str(np.datetime64('today'))

或者,如果您已经在使用熊猫,则可以使用pandas.to_datetime()函数

import pandas as pd
str(pd.to_datetime('now'))

要么,

str(pd.to_datetime('today'))

23

您可以使用以下time模块:

import time
print time.strftime("%d/%m/%Y")

>>> 06/02/2015

资本的使用Y给出了全年,而使用则y给出了06/02/15

您还可以使用以下代码来延长时间:

time.strftime("%a, %d %b %Y %H:%M:%S")
>>> 'Fri, 06 Feb 2015 17:45:09'

20

datetime.now()返回当前时间作为朴素的datetime对象,该对象表示本地时区中的时间。该值可能不明确,例如在DST转换期间(“回退”)。为避免歧义,应使用UTC时区:

from datetime import datetime

utc_time = datetime.utcnow()
print(utc_time) # -> 2014-12-22 22:48:59.916417

或具有附加时区信息的时区感知对象(Python 3.2+):

from datetime import datetime, timezone

now = datetime.now(timezone.utc).astimezone()
print(now) # -> 2014-12-23 01:49:25.837541+03:00

18
import datetime
date_time = datetime.datetime.now()

date = date_time.date()  # Gives the date
time = date_time.time()  # Gives the time

print date.year, date.month, date.day
print time.hour, time.minute, time.second, time.microsecond

dir(date)或任何变量,包括包装。您可以获得与该变量关联的所有属性和方法。


@snofty和@ user1016274,如果import datetime那是datetime.datetime.now()\ n如果from datetime import datetime那是datetime.now()
theBuzzyCoder

17
>>> import datetime, time
>>> time = time.strftime("%H:%M:%S:%MS", time.localtime())
>>> print time
'00:21:38:20S'

我认为您的意思是说“ datetime.now()。strftime(...)”
hlin117 2014年

是的,可以按照您说的做。“ datetime.datetime.now()。strftime(”%H:%M:%S:%MS“)”
user2030113 2014年

3
%MS不会给您毫秒!
ZF007

15

默认情况下,now()函数以YYYY-MM-DD HH:MM:SS:MS格式返回输出。使用以下示例脚本在Python脚本中获取当前日期和时间,并在屏幕上打印结果。创建getDateTime1.py具有以下内容的文件。

import datetime

currentDT = datetime.datetime.now()
print (str(currentDT))

输出如下所示:

2018-03-01 17:03:46.759624

14

这个问题并不需要仅仅为了它而提供一个新的答案……但是,一个闪亮的新玩具/模块就足够了。那就是Pendulum库,它似乎可以完成arrow尝试的各种工作,但没有固有的缺陷和bug困扰着arrow。

例如,原始问题的答案:

>>> import pendulum
>>> print(pendulum.now())
2018-08-14T05:29:28.315802+10:00
>>> print(pendulum.now('utc'))
2018-08-13T19:29:35.051023+00:00

有很多需要解决的标准,包括多个RFC和ISO。曾经把它们混在一起;不用担心,请看一看dir(pendulum.constants)。不过,这里还有RFC和ISO格式。

当我们说本地的时候,虽然是什么意思?好吧,我的意思是:

>>> print(pendulum.now().timezone_name)
Australia/Melbourne
>>>

大概大多数人都在别的地方。

继续下去。长话短说:Pendulum尝试在日期和时间上执行HTTP请求的操作。值得考虑,尤其是它的易用性和广泛的文档资料。


13

时区的当前时间

from datetime import datetime
import pytz

tz_NY = pytz.timezone('America/New_York') 
datetime_NY = datetime.now(tz_NY)
print("NY time:", datetime_NY.strftime("%H:%M:%S"))

tz_London = pytz.timezone('Europe/London')
datetime_London = datetime.now(tz_London)
print("London time:", datetime_London.strftime("%H:%M:%S"))

tz_India = pytz.timezone('Asia/India')
datetime_India = datetime.now(tz_India)
print("India time:", datetime_India.strftime("%H:%M:%S"))

#list timezones
pytz.all_timezones

12

试用http://crsmithdev.com/arrow/中的箭头模块:

import arrow
arrow.now()

或UTC版本:

arrow.utcnow()

要更改其输出,请添加.format():

arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ')

对于特定时区:

arrow.now('US/Pacific')

一小时前:

arrow.utcnow().replace(hours=-1)

或者,如果您要要旨。

arrow.get('2013-05-11T21:23:58.970460+00:00').humanize()
>>> '2 years ago'

5
注意arrow.now('Time/Zone')在某些时区可能会失败(arrow使用的dateutilutc中断了->在内部使用的本地转换arrow.now()。注意:pytz没有此类问题。此外,还有其他与时区相关的问题
jfs 2015年

12

我想用毫秒来获取时间。一种简单的获取方法:

import time, datetime

print(datetime.datetime.now().time())                         # 11:20:08.272239

# Or in a more complicated way
print(datetime.datetime.now().time().isoformat())             # 11:20:08.272239
print(datetime.datetime.now().time().strftime('%H:%M:%S.%f')) # 11:20:08.272239

# But do not use this:
print(time.strftime("%H:%M:%S.%f", time.localtime()), str)    # 11:20:08.%f

但是我只想毫秒,对不对?获得它们的最短方法:

import time

time.strftime("%H:%M:%S", time.localtime()) + '.%d' % (time.time() % 1 * 1000)
# 11:34:23.751

从上一个乘法中添加或删除零以调整小数点位数,或者仅:

def get_time_str(decimal_points=3):
    return time.strftime("%H:%M:%S", time.localtime()) + '.%d' % (time.time() % 1 * 10**decimal_points)

1
这在Python 3中有效:time.strftime(“%H:%M:%S”,time.localtime())+'。{}'。format(int(time(time.time()%1 * 1000))
格雷格·格雷厄姆(Greg Graham)

11

您可以使用此功能获取时间(不幸的是,它没有显示AM或PM):

def gettime():
    from datetime import datetime
    return ((str(datetime.now())).split(' ')[1]).split('.')[0]

要获取以后合并的小时,分​​钟,秒和毫秒,可以使用以下功能:

小时:

def gethour():
    from datetime import datetime
    return (((str(datetime.now())).split(' ')[1]).split('.')[0]).split(':')[0]

分钟:

def getminute():
    from datetime import datetime
    return (((str(datetime.now())).split(' ')[1]).split('.')[0]).split(':')[1]

第二:

def getsecond():
    from datetime import datetime
    return (((str(datetime.now())).split(' ')[1]).split('.')[0]).split(':')[2]

毫秒:

def getmillisecond():
    from datetime import datetime
    return (str(datetime.now())).split('.')[1]

10

如果只需要当前时间戳(以毫秒为单位)(例如,测量执行时间),则也可以使用“ timeit”模块:

import timeit
start_time = timeit.default_timer()
do_stuff_you_want_to_measure()
end_time = timeit.default_timer()
print("Elapsed time: {}".format(end_time - start_time))

8

以下是我用来获取时间而不必进行格式化的内容。有些人不喜欢split方法,但是在这里很有用:

from time import ctime
print ctime().split()[3]

它将以HH:MM:SS格式打印。


8

因为还没有人提及它,所以我最近遇到了这个问题……pytz时区的fromutc()方法与datetime的utcnow()结合是我发现获得有用的当前时间(和日期)的最佳方法在任何时区。

from datetime import datetime

import pytz


JST = pytz.timezone("Asia/Tokyo")


local_time = JST.fromutc(datetime.utcnow())

如果您想要的只是时间,那么您可以使用local_time.time()


令人惊讶的是,以上所有答案均未提及时区。您还应该包括strftime以获得所需的格式。
GraphicalDot

1
我之所以没有加入,是因为其他答案中已经涵盖了它(显示格式也不是问题的一部分)。
kungphu

7

这个问题是针对Python的,但是由于Django是Python使用最广泛的框架之一,因此必须注意,如果您使用的是Django,则可以始终使用timezone.now()而不是datetime.datetime.now()。前者是时区“知道”的,而后者则不是。

请参阅此SO答案Django文档,以获取详细信息和背后的原理timezone.now()

from django.utils import timezone

now = timezone.now()

7

您可以使用ctime()来做到这一点:

from time import time, ctime
t = time()
ctime(t)

输出:

Sat Sep 14 21:27:08 2019

这些输出是不同的,因为返回的时间戳ctime()取决于您的地理位置。

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.