如何在 Python 中获取当前时间
Posted
技术标签:
【中文标题】如何在 Python 中获取当前时间【英文标题】:How to get the current time in Python 【发布时间】:2010-09-29 18:05:14 【问题描述】:获取当前时间的模块/方法是什么?
【问题讨论】:
请注意,投票最多的答案是 timezonoe-naive datetime,而我们看到在生产环境中,全球越来越多的服务连接在一起,时区感知 datetime 成为必需的标准跨度> 另外,对于 django,请参阅 here 了解时区 这是@SławomirLenart 的一个非常有效的观点,这里有一个快速教程显示multiple ways to get the current time based on the timezone 【参考方案1】:试试这个:-
from datetime import datetime
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Current Time =", current_time)
【讨论】:
【参考方案2】:要精确获得 3 小数点毫秒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)
更多上下文:
我想以毫秒为单位获取时间。获取它们的简单方法:
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)
【讨论】:
这适用于 Python 3:time.strftime("%H:%M:%S", time.localtime()) + '.'.format(int(time.time( ) % 1 * 1000))【参考方案3】:这是仅根据您的问题显示时间的代码:
from datetime import datetime
while True:
time= datetime.now()
b = time.strftime("%H:%M:%S")
print(b, end='\r')
此代码将显示您系统的当前时间,不会停止。
【讨论】:
【参考方案4】:import datetime
print('date='+datetime.datetime.now().__str__().split(' ')[0]+' '+'time='+datetime.datetime.now().__str__().split(' ')[1]
由于Qt被广泛使用,
from PyQt5 import QDateTime
print(QDateTime.currentDateTime().__str__().split('(')[1].rstrip(')'))
【讨论】:
与其他答案相比,您的答案冗长而复杂【参考方案5】:您可以使用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'
【讨论】:
【参考方案6】:如何在 Python 中获取当前时间?
time
模块
time
模块提供了以“自纪元以来的秒数”为单位告诉我们时间的函数以及其他实用程序。
import time
Unix 纪元时间
这是您在数据库中保存时间戳时应采用的格式。它是一个简单的浮点数,可以转换为整数。它也适用于以秒为单位的算术运算,因为它表示自 1970 年 1 月 1 日 00:00:00 以来的秒数,并且相对于我们接下来要研究的其他时间表示而言,它是记忆之轻:
>>> time.time()
1424233311.771502
此时间戳不考虑闰秒,因此它不是线性的 - 闰秒被忽略。因此,虽然它不等同于国际 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
(如果没有给出,否则请参阅下面的时区感知)。它有一个在 shell 上回显的表示(允许您重新创建一个等效对象),但是当打印(或强制为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 时区感知
但是,到目前为止,我们创建的日期时间对象都不能轻松转换为不同的时区。我们可以使用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
您还可以使用 pytz
timezone 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
对象。
【讨论】:
我想每个人都同意ctime
必须是格式化日期时间的最奇怪的方式。星期几和月份的缩写,月份的日期,24 小时制 h:m:s,然后是四位数的年份。喜欢对日期字符串进行排序的书呆子、美国人、欧洲人……每个人——是的,每个人——都可以在这种格式中找到至少两件令人恼火的事情。虽然我会使用它,因为它超级简单。
正如我上面所说的ctime
:“您还可以以操作系统首选的方式表示当前时间(这意味着它可以在您更改系统偏好设置时更改,所以不要正如我所看到的其他人所期望的那样,这将成为所有系统的标准)。这通常是用户友好的,但通常不会导致可以按时间顺序排序的字符串:"【参考方案7】:
你可以试试下面的
import datetime
now = datetime.datetime.now()
print(now)
或
import datetime
now = datetime.datetime.now()
print(now.strftime("%Y-%b-%d, %A %I:%M:%S"))
【讨论】:
【参考方案8】:从 Python 3.9 开始,zoneinfo
模块可用于获取时区,而不是使用第三方库。
获取特定时区的当前时间:
from datetime import datetime
from zoneinfo import ZoneInfo
datetime.now(tz=ZoneInfo("Europe/Amsterdam"))
【讨论】:
可供下载的最新Python版本是3.8.5! python.org/downloads 当然可以,但是以后其他人阅读这篇文章时,就不会这样了。事实上,今天发布了第一个候选版本:docs.python.org/3.9/whatsnew/3.9.html【参考方案9】:如果您想要时间用于计时函数调用,那么您需要 time.perf_counter()。
start_time = time.perf_counter()
expensive_function()
time_taken = time.perf_counter() - start_time
print(f'expensive_function() took round(time_taken,2)s')
https://docs.python.org/3/library/time.html#time.perf_countertime.perf_counter() → 浮动
返回性能计数器的值(以秒为单位),即具有最高可用分辨率的时钟以测量短持续时间。它确实包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点是未定义的,因此只有连续调用的结果之间的差异才有效。
3.3 版中的新功能。
time.perf_counter_ns() → int
类似于 perf_counter(),但返回时间为纳秒。
3.7 版中的新功能。
【讨论】:
【参考方案10】:我们可以使用 datetime 模块来实现这一点
>>> from datetime import datetime
>>> now = datetime.now() #get a datetime object containing current date and time
>>> current_time = now.strftime("%H:%M:%S") #created a string representing current time
>>> print("Current Time =", current_time)
Current Time = 17:56:54
另外,我们可以使用pytZ module获取时区的当前时间。
>>> from pytz import timezone
>>> import pytz
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
>>> amsterdam = timezone('Europe/Amsterdam')
>>> datetime_eu = datetime.now(amsterdam)
>>> print("Europe time::", datetime_eu.strftime("%H:%M:%S"))
Europe time:: 14:45:31
【讨论】:
【参考方案11】:time
模块可以导入各种时间的东西,包括睡眠和其他类型的东西,包括 - 当前时间类型
import time
time.strftime("%T", time.localtime())
输出应该是这样的
05:46:33
11:22:56
13:44:55
22:33:44
00:00:00
【讨论】:
【参考方案12】:方法一:从系统日期时间获取当前日期和时间
datetime 模块提供用于处理日期和时间的类。
代码
from datetime import datetime,date
print("Date: "+str(date.today().year)+"-"+str(date.today().month)+"-"+str(date.today().day))
print("Year: "+str(date.today().year))
print("Month: "+str(date.today().month))
print("Day: "+str(date.today().day)+"\n")
print("Time: "+str(datetime.today().hour)+":"+str(datetime.today().minute)+":"+str(datetime.today().second))
print("Hour: "+str(datetime.today().hour))
print("Minute: "+str(datetime.today().minute))
print("Second: "+str(datetime.today().second))
print("MilliSecond: "+str(datetime.today().microsecond))
输出会是这样的
Date: 2020-4-18
Year: 2020
Month: 4
Day: 18
Time: 19:30:5
Hour: 19
Minute: 30
Second: 5
MilliSecond: 836071
方法 2:如果网络可用,则获取当前日期和时间
urllib 包帮助我们处理表示网页的 url。这里我们从网页http://just-the-time.appspot.com/收集数据,并使用dateparser包从网页中解析出datetime。
代码
from urllib.request import urlopen
import dateparser
time_url = urlopen(u'http://just-the-time.appspot.com/')
datetime = time_url.read().decode("utf-8", errors="ignore").split(' ')[:-1]
date = datetime[0]
time = datetime[1]
print("Date: "+str(date))
print("Year: "+str(date.split('-')[0]))
print("Month: "+str(date.split('-')[1]))
print("Day: "+str(date.split('-')[2])+'\n')
print("Time: "+str(time))
print("Hour: "+str(time.split(':')[0]))
print("Minute: "+str(time.split(':')[1]))
print("Second: "+str(time.split(':')[2]))
输出会是这样的
Date: 2020-04-18
Year: 2020
Month: 04
Day: 18
Time: 14:17:10
Hour: 14
Minute: 17
Second: 10
方法3:从机器本地时间获取当前日期和时间
Python 的 time 模块提供了一个函数,用于从称为 localtime() 的纪元以来经过的秒数中获取本地时间。 ctime() 函数将自纪元以来经过的秒数作为参数,并返回一个表示本地时间的字符串。
代码
from time import time, ctime
datetime = ctime(time()).split(' ')
print("Date: "+str(datetime[4])+"-"+str(datetime[1])+"-"+str(datetime[2]))
print("Year: "+str(datetime[4]))
print("Month: "+str(datetime[1]))
print("Day: "+str(datetime[2]))
print("Week Day: "+str(datetime[0])+'\n')
print("Time: "+str(datetime[3]))
print("Hour: "+str(datetime[3]).split(':')[0])
print("Minute: "+str(datetime[3]).split(':')[1])
print("Second: "+str(datetime[3]).split(':')[2])
输出会是这样的
Date: 2020-Apr-18
Year: 2020
Month: Apr
Day: 18
Week Day: Sat
Time: 19:30:20
Hour: 19
Minute: 30
Second: 20
【讨论】:
【参考方案13】:您可以使用 ctime() 来做到这一点:
from time import time, ctime
t = time()
ctime(t)
输出:
Sat Sep 14 21:27:08 2019
这些输出不同,因为ctime()
返回的时间戳取决于您的地理位置。
【讨论】:
【参考方案14】:时区的当前时间
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
【讨论】:
【参考方案15】:from datetime import datetime
datetime.now().strftime('%Y-%m-%d %H:%M:%S')
对于这个例子,输出将是这样的:'2013-09-18 11:16:32'
这是strftime
directives的列表。
【讨论】:
【参考方案16】:这个问题不需要一个新的答案只是为了它......一个闪亮的新玩具/模块,然而,足够的理由。那就是Pendulum library,它似乎做了箭头尝试的那种事情,除了没有困扰箭头的固有缺陷和错误。
比如原问题的答案:
>>> 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 所做的事情。值得考虑,尤其是它的易用性和丰富的文档。
【讨论】:
【参考方案17】:用途:
>>> 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
更多信息请参见the documentation。
为了节省输入,您可以从datetime
模块中导入datetime
对象:
>>> from datetime import datetime
然后从以上所有内容中删除前导datetime.
。
【讨论】:
如果这个答案涵盖时区(可能是 UTC 为例)并且可能以 time.time() 开头,那就太好了。 @Toskan 格式不是问题的一部分,因此它不应该成为答案的一部分。已经提供了一个链接,指向该模块的更多文档,其中包含格式等内容。 原始答案是哪个版本的 Python?只需在我的 Python 2.7 交互式控制台中输入datetime.datetime.now()
(IronPython 尚未更新),我就会得到与答案中使用 print()
的较新示例相同的行为。我没有成功复制原始答案显示的内容(datetime.datetime(2009, 1, 6, 15, 8, 24, 78915))。 (不是我真的想要, print() 行为是首选,但我很好奇。)
@BobVicktor:Python 2.7、3.7 和 3.8 对我来说都给出了相同的行为,不确定你看到了什么。
@HarleyHolcombe 嗯...也许是 IronPython 的东西?当我自己输入datetime.now()
时,它会打印出来,就像你的答案显示print(datetime.now())
...【参考方案18】:
import datetime
todays_date = datetime.date.today()
print(todays_date)
>>> 2019-10-12
# adding strftime will remove the seconds
current_time = datetime.datetime.now().strftime('%H:%M')
print(current_time)
>>> 23:38
【讨论】:
【参考方案19】:这很简单。 试试:
import datetime
date_time = str(datetime.datetime.now())
date = date_time.split()[0]
time = date_time.split()[1]
【讨论】:
【参考方案20】:前面的回答都是不错的建议,不过我觉得用ctime()
最方便:
In [2]: from time import ctime
In [3]: ctime()
Out[3]: 'Thu Oct 31 11:40:53 2013'
这给出了当前本地时间的格式良好的字符串表示。
【讨论】:
OP 询问如何获取时间,而不是如何显示时间!【参考方案21】:最快的方法是:
>>> import time
>>> time.strftime("%Y%m%d")
'20130924'
【讨论】:
【参考方案22】:>>> import datetime, time
>>> time = time.strftime("%H:%M:%S:%MS", time.localtime())
>>> print time
'00:21:38:20S'
【讨论】:
我想你的意思是说“datetime.now().strftime(...)” 是的,可以如你所说。 "datetime.datetime.now().strftime("%H:%M:%S:%MS")" %MS 不给你毫秒!!【参考方案23】:你可以使用这个函数来获取时间(不幸的是它没有说上午或下午):
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]
【讨论】:
【参考方案24】:这个问题是针对 Python 的,但由于 Django 是 Python 中使用最广泛的框架之一,因此需要注意的是,如果您使用的是 Django,则始终可以使用 timezone.now()
而不是 datetime.datetime.now()
。前者是“感知”时区,而后者不是。
请参阅this SO answer 和Django doc,了解timezone.now()
背后的详细信息和基本原理。
from django.utils import timezone
now = timezone.now()
【讨论】:
【参考方案25】:如果您已经在使用 numpy,那么您可以直接使用 numpy.datetime64() 功能。
import numpy as np
str(np.datetime64('now'))
仅限日期:
str(np.datetime64('today'))
或者,如果您已经在使用 pandas,那么您可以使用 pandas.to_datetime() 函数
import pandas as pd
str(pd.to_datetime('now'))
或者,
str(pd.to_datetime('today'))
【讨论】:
【参考方案26】:获取当前日期时间属性:
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
【讨论】:
【参考方案27】: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'
),然后您调用split()
方法将从您的字符串['Wed','Jan','17','16:56:45','2018']
(默认分隔符)中创建一个列表是空间)。
括号用于在列表中“选择”想要的参数。
一个人应该只调用一个代码行。不应该像我那样称呼他们,这只是一个例子,因为在某些情况下你会得到不同的值,罕见但并非不可能的情况。
【讨论】:
您可能还想解释为什么从多次调用ctime()
中提取部分(在每次调用中使用“当前”时间)不一定会在相互结合时给出有用的值。
//
在这里做什么?【参考方案28】:
使用pandas 获取当前时间,有点矫枉过正手头的问题:
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
【讨论】:
此方法将在以后的 pandas 版本中被弃用。请改用 datetime 模块。【参考方案29】:>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %X +0000", gmtime())
'Tue, 06 Jan 2009 04:54:56 +0000'
以指定格式输出当前 GMT。还有一个localtime()
方法。
这个page有更多细节。
【讨论】:
【参考方案30】:import datetime
date_time = str(datetime.datetime.now()).split()
date,time = date_time
date 将打印日期,time 将打印时间。
【讨论】:
以上是关于如何在 Python 中获取当前时间的主要内容,如果未能解决你的问题,请参考以下文章