QDate, QTime, QDateTime
PyQt5有QDate, QDateTime, QTime类来处理日期和时间。QDate是一个类,用于处理公历中的日历日期。它具有确定日期、比较日期或操作日期的方法。QTime类使用时钟时间。它提供了比较时间、确定时间和其他各种时间操作方法的方法。QDateTime是一个将QDate和QTime对象组合成一个对象的类。
当前日期和时间
PyQt5有currentDate
, currentTime
和currentDateTime
方法来确定当前日期和时间。
current_date_time.py
#!/usr/bin/python
from PyQt5.QtCore import QDate, QTime, QDateTime, Qt
now = QDate.currentDate()
print(now.toString(Qt.ISODate))
print(now.toString(Qt.DefaultLocaleLongDate))
datetime = QDateTime.currentDateTime()
print(datetime.toString())
time = QTime.currentTime()
print(time.toString(Qt.DefaultLocaleLongDate))
该示例以各种格式打印当前日期、日期和时间以及时间。
now = QDate.currentDate()
currentDate
方法返回当前日期。
print(now.toString(Qt.ISODate))
print(now.toString(Qt.DefaultLocaleLongDate))
通过将值Qt.ISODate
和Qt.DefaultLocaleLongDate
传递给toString
方法,以两种不同的格式打印日期。
datetime = QDateTime.currentDateTime()
currentDateTime
返回当前日期和时间。
time = QTime.currentTime()
最后,currentTime
方法返回当前时间。
上面的程序输出如下:
$ ./current_date_time.py
2020-05-16
Saturday, May 16, 2020
Sat May 16 09:53:37 2020
9:53:37 AM CEST
UTC时间
我们的星球是一个球体;它绕着它的轴旋转。地球向东方旋转,所以太阳在不同的时间在不同的地点升起。地球大约24小时自转一次。因此,世界被划分为24个时区。每个时区都有不同的当地时间。这个当地时间通常会被夏时制进一步修改。
现实需要一个全球时间。统一的全球时间有助于避免时区和夏令时的混淆。选择UTC(世界协调时间)作为主要时间标准。UTC用于航空、天气预报、飞行计划、空中交通管制许可和地图。与当地时间不同,UTC不随季节的变化而变化。
utc_local.py
#!/usr/bin/python
from PyQt5.QtCore import QDateTime, Qt
now = QDateTime.currentDateTime()
print('Local datetime: ', now.toString(Qt.ISODate))
print('Universal datetime: ', now.toUTC().toString(Qt.ISODate))
print(f'The offset from UTC is: {now.offsetFromUtc()} seconds')
该示例确定当前的通用和本地日期和时间。
print('Local datetime: ', now.toString(Qt.ISODate))
currentDateTime
方法返回以本地时间表示的当前日期和时间。我们可以使用toLocalTime
将通用时间转换为本地时间。
print('Universal datetime: ', now.toUTC().toString(Qt.ISODate))
我们使用toUTC
方法从日期时间对象获得UTC时间。
print(f'The offset from UTC is: {now.offsetFromUtc()} seconds')
offsetFromUtc
以秒为单位给出世界时和本地时间之间的差值。
程序输出:
$ ./utc_local.py
Local datetime: 2020-05-16T09:56:23
Universal datetime: 2020-05-16T07:56:23Z
The offset from UTC is: 7200 seconds
天数
特定月份中的天数由daysInMonth
方法返回,而一年中的天数由daysInYear
方法返回。
n_of_days.py
#!/usr/bin/python
from PyQt5.QtCore import QDate, Qt
now = QDate.currentDate()
d = QDate(1945, 5, 7)
print(f'Days in month: {d.daysInMonth()}')
print(f'Days in year: {d.daysInYear()}')
该示例打印所选日期在一个月和一年中的天数。
$ ./n_of_days.py
Days in month: 31
Days in year: 365
日差
daysTo
方法返回从一个日期到另一个日期的天数。
xmas.py
#!/usr/bin/python
from PyQt5.QtCore import QDate
xmas1 = QDate(2019, 12, 24)
xmas2 = QDate(2020, 12, 24)
now = QDate.currentDate()
dayspassed = xmas1.daysTo(now)
print(f'{dayspassed} days have passed since last XMas')
nofdays = now.daysTo(xmas2)
print(f'There are {nofdays} days until next XMas')
该示例计算从上一个XMas到下一个XMas的天数。
$ ./xmas.py
144 days have passed since last XMas
There are 222 days until next XMas
Datetime算术
我们经常需要在日期时间值上加减日、秒或年。
arithmetic.py
#!/usr/bin/python
from PyQt5.QtCore import QDateTime, Qt
now = QDateTime.currentDateTime()
print(f'Today:', now.toString(Qt.ISODate))
print(f'Adding 12 days: {now.addDays(12).toString(Qt.ISODate)}')
print(f'Subtracting 22 days: {now.addDays(-22).toString(Qt.ISODate)}')
print(f'Adding 50 seconds: {now.addSecs(50).toString(Qt.ISODate)}')
print(f'Adding 3 months: {now.addMonths(3).toString(Qt.ISODate)}')
print(f'Adding 12 years: {now.addYears(12).toString(Qt.ISODate)}')
该示例确定当前日期时间,并添加或减去日、秒、月和年。
$ ./arithmetic.py
Today: 2020-05-16T10:11:56
Adding 12 days: 2020-05-28T10:11:56
Subtracting 22 days: 2020-04-24T10:11:56
Adding 50 seconds: 2020-05-16T10:12:46
Adding 3 months: 2020-08-16T10:11:56
Adding 12 years: 2032-05-16T10:11:56
夏令时(Daylight saving time)
夏令时(DST)是在夏季将时钟调快的做法,这样晚上的日光就会持续更长时间。时间在春天开始时向前调整一小时,在秋天向后调整到标准时间。
daylight_saving.py
#!/usr/bin/python
from PyQt5.QtCore import QDateTime, QTimeZone, Qt
now = QDateTime.currentDateTime()
print(f'Time zone: {now.timeZoneAbbreviation()}')
if now.isDaylightTime():
print(f'The current date falls into DST time')
else:
print(f'The current date does not fall into DST time')
该示例检查日期时间是否为夏令时。
print(f'Time zone: {now.timeZoneAbbreviation()}')
timeZoneAbbreviation
方法返回日期时间的时区缩写。
if now.isDaylightTime():
...
如果日期时间属于夏令时,则返回isDaylightTime
。
$ ./daylight_saving.py
Time zone: CEST
The current date falls into DST time
当前日期属于夏令时。该计划于夏季在中欧城市布拉迪斯拉发执行。中欧夏令时(CEST)比世界时间早2小时。这个时区是一个夏令时时区,在欧洲和南极洲使用。冬季使用的标准时间是中欧时间(CET)。
Unix纪元(epoch)
一个纪元是时间上的一个瞬间,被选为一个特定时代的起源。例如,在西方基督教国家,时间纪元从耶稣出生的第0天开始。另一个例子是使用了12年的法国共和历法。这个时代是共和时代的开始,于1792年9月22日宣布,这一天第一共和国宣布成立,君主制废除。
电脑也有自己的时代。其中最流行的是Unix纪元。Unix纪元是1970年1月1日的00:00:00 UTC时间(或1970- 01-01T00:00:00Z ISO 8601)。计算机中的日期和时间是根据自该计算机或平台的定义纪元以来经过的秒数或时钟滴答数来确定的。
Unix时间是指从Unix纪元开始经过的秒数。
$ date +%s
1589617100
Unix date
命令可用于获取Unix时间。在这个特殊的时刻,从Unix纪元到现在已经过去了1589617100秒。
unix_time.py
#!/usr/bin/python3
from PyQt5.QtCore import QDateTime, Qt
now = QDateTime.currentDateTime()
unix_time = now.toSecsSinceEpoch()
print(unix_time)
d = QDateTime.fromSecsSinceEpoch(unix_time)
print(d.toString(Qt.ISODate))
该示例打印Unix时间并将其转换回QDateTime
。
now = QDateTime.currentDateTime()
首先,我们检索当前日期和时间。
unix_time = now.toSecsSinceEpoch()
toSecsSinceEpoch
返回Unix时间。
d = QDateTime.fromSecsSinceEpoch(unix_time)
使用fromSecsSinceEpoch
,我们将Unix时间转换为QDateTime
。
$ ./unix_time.py
1589617144
2020-05-16T10:19:04
儒略日(Julian day)
儒略日指的是自儒略日开始以来连续计算的天数。它主要由天文学家使用。它不应与儒略历(Julian calendar)混淆。朱利安时期开始于公元前4713年。儒略日数字0被分配到从公元前4713年1月1日中午开始的那一天。
儒略历日数(JDN)是自该时间段开始以来经过的天数。任何时刻的儒略历日期(JD)是前一个正午的儒略历数加上从该时刻开始的一天的分数。(Qt不计算这个分数。)除了天文学,儒略历也经常被军事和主机程序使用。
julian_day.py
#!/usr/bin/python
from PyQt5.QtCore import QDate, Qt
now = QDate.currentDate()
print('Gregorian date for today:', now.toString(Qt.ISODate))
print('Julian day for today:', now.toJulianDay())
在本例中,我们计算今天的公历日期和儒略历日。
print('Julian day for today:', now.toJulianDay())
使用toJulianDay
方法返回儒略日。
$ ./julian_day.py
Gregorian date for today: 2020-05-16
Julian day for today: 2458986
历史上的战争
有了儒略日,就可以进行跨越几个世纪的计算。
battles.py
#!/usr/bin/python
from PyQt5.QtCore import QDate, Qt
borodino_battle = QDate(1812, 9, 7)
slavkov_battle = QDate(1805, 12, 2)
now = QDate.currentDate()
j_today = now.toJulianDay()
j_borodino = borodino_battle.toJulianDay()
j_slavkov = slavkov_battle.toJulianDay()
d1 = j_today - j_slavkov
d2 = j_today - j_borodino
print(f'Days since Slavkov battle: {d1}')
print(f'Days since Borodino battle: {d2}')
该示例计算自两个历史事件以来经过的天数。
borodino_battle = QDate(1812, 9, 7)
slavkov_battle = QDate(1805, 12, 2)
我们有拿破仑时代两次战役的日期。
j_today = now.toJulianDay()
j_borodino = borodino_battle.toJulianDay()
j_slavkov = slavkov_battle.toJulianDay()
我们计算今天的儒略历日以及Slavkov战役和Borodino战役的儒略历日。
d1 = j_today - j_slavkov
d2 = j_today - j_borodino
我们计算两次战役以来的天数。
$ ./battles.py
Days since Slavkov battle: 78328
Days since Borodino battle: 75857
当我们运行这个脚本时,距离Slavkov战役已经过去了78328天,距离Borodino战役已经过去了75857天。