翻译自原文:PyQt5 date and time

翻译时间 2020 年 8 月 18 日

PyQt5 教程的这一部分演示了如何使用 PyQt5 中的日期和时间。

QDate, QTime, QDateTime

PyQt5 具有QDate, QDateTime, QTime类要处理日期和时间: + QDate是用于处理公历中的日历日期的类。它具有确定日期、比较或操作日期的方法 + QTime类使用时钟时间。它提供了比较时间、确定时间和各种其他时间操作方法的方法 + QDateTime是将QDateQDate对象合并到一个对象的类

当前日期和时间

PyQt5 具有currentDatecurrentTimecurrentDateTime用于确定当前日期和时间的方法。

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.ISODateQt.DefaultLocaleLongDatetoString方法,以两种不同的格式打印日期。

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.toLocalTime().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.toLocalTime().toString(Qt.ISODate))

currentDateTime方法返回以本地时间表示的当前日期和时间。我们可以使用toLocalTime将通用时间转换为本地时间。

print('Universal datetime: ', now.toUTC().toString(Qt.ISODate))

通过toUTC方法从日期时间对象获取通用时间。

print(f'The offset from UTC is: {now.offsetFromUtc()} seconds')

offsetFromUtc方法给出通用时间和本地时间之间的差值(以秒为单位)。

$ ./utc_local.py 
Local datetime:  2020-05-16
T09:56:23
Universal datetime:  2020-05-16
T07: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.py 
144 days have passed since last XMas
There are 222 days until next XMas

这是输出。

日期时间算术

我们经常需要将天、秒或年加或减为日期时间值。

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-16
T10:11:56
Adding 12 days: 2020-05-28
T10:11:56
Subtracting 22 days: 2020-04-24
T10:11:56
Adding 50 seconds: 2020-05-16
T10:12:46
Adding 3 months: 2020-08-16
T10:11:56
Adding 12 years: 2032-05-16
T10:11:56

这是示例输出。

夏令时

夏令时 (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()返回true。

$ ./daylight_saving.py 
Time zone: CEST
The current date falls into DST time

Unix 纪元

一个时代是选择作为特定时代起源的瞬间时间。例如,在西方基督教国家,时间时代从第0天开始,耶稣出生的时候。另一个例子是法国共和历,它使用了十二年。这个纪元是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 日期命令可用于获取 Unix 时间。在这个特殊的时刻,1589617100秒已经过去了,因为Unix时代。

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-16
T10:19:04

这是输出。

Julian day(朱利安日)

朱利安日是指自朱利安时期开始以来的连续数天数。它主要用于天文学家。它不应该与朱利安历法混淆。儒略时期开始于2713年。儒略日 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()

我们计算今天和斯拉夫科夫和博罗迪诺战役的朱利安时代。

d1 = j_today - j_slavkov
d2 = j_today - j_borodino

我们计算两次战斗以来的天数。

$ ./battles.py 
Days since Slavkov battle: 78328
Days since Borodino battle: 75857

当我们运行这个脚本,78328天已经过去,因为斯拉夫科夫战斗,75857自博罗迪诺战斗。

在 PyQt5 教程的这一部分中,我们处理过日期和时间。