datetime:如何在Python中获取当前时间

 2019-04-05 

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


使用:

1
2
3
4
5
6
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2009, 1, 6, 15, 8, 24, 78915)

>>> print(datetime.datetime.now())
2018-07-29 09:17:13.812189

还有时间:

1
2
3
4
5
>>> datetime.datetime.now().time()
datetime.time(15, 8, 24, 78915)

>>> print(datetime.datetime.now().time())
09:17:51.914526

有关更多信息,请参阅文档。

要保存类型,可以从datetime模块导入datetime对象:

1
>>> from datetime import datetime

然后将前面的datetime.移除。


你可以使用time.strftime():

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


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

对于本例,输出如下:'2013-09-18 11:16:32'

这是strftime的列表。


类似于Harley的答案,但是使用str()函数来实现一个快速-n-dirty,稍微更适合人类阅读的格式:

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


How do I get the current time in Python?

time模块

time模块提供了一些函数,这些函数告诉我们"从纪元开始的几秒钟"的时间以及其他实用程序。

1
import time

Unix纪元的时间

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

1
2
>>> time.time()
1424233311.771502

这个时间戳不考虑闰秒,所以它不是线性的——闰秒被忽略。因此,虽然它不等于国际协调世界时标准,但它是接近的,因此对于大多数情况下的记录保持相当好。

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

time.ctime

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

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

您还可以使用ctime将时间戳水合成人类可读的形式:

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

这种转换对记录保存也不好(除了文本只能由人类解析——随着光学字符识别和人工智能的改进,我认为这种情况的数量将会减少)。

datetime模块

datetime模块在这里也很有用:

1
>>> import datetime

datetime.datetime.now

datetime.now是一个返回当前时间的类方法。它使用的time.localtime没有时区信息(如果没有提供,否则请参阅下面的时区感知)。它有一个表示法(这将允许您重新创建一个等价的对象)在外壳上回显,但是当打印(或强制为str)时,它是人类可读的(而且几乎是ISO)格式,并且字典排序相当于时间排序:

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

datetime的utcnow

你可以得到一个UTC时间的datetime对象,一个全局标准,通过这样做:

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

UTC是一个几乎相当于格林尼治时区的时间标准。(虽然格林威治标准时间和UTC夏令时不会改变,但它们的用户可以在夏季切换到其他时区,比如英国的夏季时间。)

datetime时区知道

但是,到目前为止,我们创建的所有datetime对象都不能轻松转换为不同的时区。我们可以用pytz模块来解决这个问题:

1
2
3
4
>>> 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模块留给读者作为练习):

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

我们可以很容易地将原始utc对象转换为时区。

1
2
3
4
>>> 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

您还可以使用pytz timezone localize方法使一个朴素的datetime对象感知到,或者通过替换tzinfo属性(使用replace,这是盲目的)来实现,但是这些都是最后的手段,而不是最佳实践:

1
2
3
4
>>> 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历元时间更容易出错,我首先演示了这一点。

其他查看时间的方法更容易出错,尤其是在处理可能来自不同时区的数据时。您希望不要混淆字符串或序列化的datetime对象的目标时区。

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


1
2
3
from time import time

t = time()

t -浮点数,适用于时间间隔测量。

Unix平台和Windows平台有一些不同。


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

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

本页有更多细节。


这些都是很好的建议,但我发现自己最容易使用ctime():

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

这提供了当前本地时间的格式良好的字符串表示。


简单和容易的:

使用datetime模块,

1
2
import datetime
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

输出:

1
2017-10-17 23:48:55

使用time,

1
2
import time
print(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))

输出:

1
2017-10-17 18:22:26


如果你需要一个time对象的当前时间:

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

最快的方法是

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

.isoformat()在文档中,但不在这里(这与@Ray Vega的回答非常相似):

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


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

1
2
3
4
5
6
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])

如果你住在华盛顿特区(像我一样),延迟可能不会太糟…


这就是我最后的结论:

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

此外,对于选择适当的格式代码以获得按您希望的方式格式化的日期(从这里的Python"datetime"文档),这个表也是一个必要的参考。

strftime format code table


用熊猫来获取当前时间,有点过分地扼杀了眼前的问题:

1
2
3
4
5
6
7
8
9
10
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)

输出:

1
2
3
4
5
6
7
8
9
2017-09-22 12:44:56.092642
2017-09-22
2017
9
22
12
44
56
92693

1
2
3
4
5
6
7
8
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)或任何变量,包括包。您可以获得与该变量关联的所有属性和方法。


datetime.now()将当前时间作为表示本地时区时间的朴素datetime对象返回。该值可能是模糊的,例如,在DST转换期间("后退")。为了避免歧义,应该使用UTC时区:

1
2
3
4
from datetime import datetime

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

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

1
2
3
4
from datetime import datetime, timezone

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

从http://crsmithdev.com/arrow/尝试箭头模块:

1
2
import arrow
arrow.now()

或UTC版本:

1
arrow.utcnow()

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

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

特定时区:

1
arrow.now('US/Pacific')

一个小时前:

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

或者如果你想知道要点。

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


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

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

只适用于日期:

1
str(np.datetime64('today'))

或者,如果您已经在使用panda,那么可以使用Pandas .to_datetime()函数:

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

或者:

1
str(pd.to_datetime('today'))


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

1
2
3
4
import datetime

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

输出如下:

1
2018-03-01 17:03:46.759624

您可以使用time模块。

1
2
3
4
import time
print time.strftime("%d/%m/%Y")

>>> 06/02/2015

使用大写字母表示全年,使用大写字母表示全年。

你也可以用更长的时间。

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


我想要以毫秒为单位的时间。获得它们的一个简单方法:

1
2
3
4
5
6
7
8
9
10
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

但我只需要毫秒,对吧?获得它们的捷径:

1
2
3
4
import time

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

从最后一次乘法中添加或删除零来调整小数点的个数,或者:

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


1
2
3
4
>>> import datetime, time
>>> time = strftime("%H:%M:%S:%MS", time.localtime())
>>> print time
'00:20:58:20S'


这个问题不需要一个新的答案,只是为了它…然而,一个闪亮的新玩具/模块就足够了。那就是钟摆库,它似乎做了绿箭侠想做的事情,除了没有绿箭侠身上固有的缺陷和bug。

例如,最初问题的答案:

1
2
3
4
5
>>> import pendulum
>>> print(pendulum.now())
2018-08-14T05:29:28.315802+10:00
>>> print(pendulum.utcnow())
2018-08-13T19:29:35.051023+00:00

有很多需要解决的标准,包括多个rfc和ISOs,需要担心。把它们混在一起;不用担心,看一下dir(pendulum.constants)里面有比RFC和ISO格式更多的格式。

当我们说本地的时候,是什么意思呢?我的意思是:

1
2
3
>>> print(pendulum.now().timezone_name)
Australia/Melbourne
>>>

想必你们大多数人指的是其他地方。

然后继续。长话短说:钟摆尝试像请求处理HTTP那样处理日期和时间。它值得考虑,尤其是因为它的易用性和广泛的文档。


如果你只想要ms中的当前时间戳(例如,测量执行时间),你也可以使用"timeit"模块:

1
2
3
4
5
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))

1
2
3
import datetime
date_time = str(datetime.datetime.now()).split()
date,time = date_time

日期将打印日期,时间将打印时间。


你可以使用这个函数来获取时间(不幸的是它没有显示AM或PM):

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

要获得小时、分钟、秒和毫秒以便以后合并,可以使用以下函数:

小时:

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

分钟:

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

第二:

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

毫秒:

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

因为还没有人提起过,这是我最近碰到的……pytz时区的fromutc()方法与datetime的utcnow()相结合,是我发现的在任何时区获得有用的当前时间(和日期)的最佳方法。

1
2
3
4
5
6
7
8
9
from datetime import datetime

import pytz


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


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

如果你想要的只是时间,你可以用local_time.time()得到它。


下面是我不用格式化就能得到时间的方法。有些人不喜欢分割方法,但它在这里很有用:

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

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


1
2
3
4
5
6
7
8
9
10
11
12
from time import ctime

// Day {Mon,Tue,..}
print ctime().split()[0]
// Month {Jan, Feb,..}
print ctime().split()[1]
// Date {1,2,..}
print ctime().split()[2]
// HH:MM:SS
print ctime().split()[3]
// Year {2018,..}
print ctime().split()[4]

当您调用ctime()时,它将以"Day Month Date HH:MM:SS Year"(例如:"Wed January 17 16:53:22 2018")的格式将秒转换为字符串(默认delimeter为space)(例如:"Wed"、"Jan"、"17"、"16:56:45"、"2018")。

方括号用于"选择"列表中需要的参数。

应该只调用一行代码。人们不应该像我这样调用它们,这只是一个例子,因为在某些情况下,你会得到不同的值,罕见但不是不可能的情况。


首先从datetime导入datetime模块

1
from datetime import datetime

然后将当前时间打印为'yyyy-mm-dd hh:mm:ss'

1
print(str(datetime.now())

要以"hh:mm:ss"的形式获得时间,其中ss表示秒数加上经过的秒数,只需执行以下操作;

1
print(str(datetime.now()[11:])

将date .now()转换为字符串会得到一个答案,其格式与我们习惯的常规日期和时间类似。


这很简单。试一试:

1
2
3
4
    import datetime
    date_time = str(datetime.datetime.now())
    date = date_time.split()[0]
    time = date_time.split()[1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
get current date time attributes:


import datetime

currentDT = datetime.datetime.now()

print ("Current Year is: %d" % currentDT.year)
print ("Current Month is: %d" % currentDT.month)
print ("Current Day is: %d" % currentDT.day)
print ("Current Hour is: %d" % currentDT.hour)
print ("Current Minute is: %d" % currentDT.minute)
print ("Current Second is: %d" % currentDT.second)
print ("Current Microsecond is: %d" % currentDT.microsecond)


#!/usr/bin/python
import time;

ticks = time.time()
print"Number of ticks since"12:00am, Jan 1, 1970":", ticks