时间概念
utc与时区
UTC是Coordinated Universal Time的缩写,是全球时间的标准,UTC时间不受时区和夏令时的影响,是时间的标准。全球各地的时间以UTC时间为参考进行调整。
时区是Time Zone,是地球上按照经度划分的区域,每个区域有自己的标准时间,时区与UTC时间的差距通常以小时为单位(但有些时区偏移的时间有30分钟)。整个地球被划分为24个主要时区,每个时区大约覆盖15度经度(360度/24小时)
北京时间是东八区,东八区也就是比UTC时间偏移了8小时,也就是UTC+8,在世界上,同样在东八区的,还有澳大利亚的地区。
纽约时间是西五区,也就是UTC-5,因此,距离北京时间的东八区标准时间差是13小时。但是需要注意的是,当纽约地区开始夏令时的时候,会变成UTC-4,此时就是常见的12小时时差了。
东京时间是东九区,也就是UTC+9,因此,距离北京时间的东八区差是1小时,且是早1小时。
夏令时
夏令时是一种人为调整时钟的制度,通常在春季将时钟向前调一个小时,其目的是延长晚间的日照时间,旨在更有效地利用日光资源,减少能源消耗。
其中,北半球的高纬度国家通常使用夏令时,因为其纬度高,日照变化大。与之相反,接近赤道的地区,日照变化不大,因此通常不用夏令时。例如大部分亚洲国家,如中国,日本,韩国,都不使用夏令时。
没有使用过夏令时地区的人,通常对于夏令时的作用不太了解,具体来说:夏令时期间,时钟被拨快一小时。这意味着人们按照新的时间表作息,早上实际比平时早起一小时,但由于夏季天亮较早,对生活影响不大。下午下班时,按照新的时间,天色仍然明亮,人们可以在下班后享受更多的日照时间。
时间戳
时间戳是Timestamp是一种表示特定时间点的数字格式,基于UTC时间的1970年1月1日00:00:00以来经过的秒数或毫秒数来表示,时间戳可以精确地标识一个具体的时间点,该时间点不受时区影响。
时间戳在编程中有很大作用,例如,记录某个系统事件,用户注册的时间,或者通过计算时间戳的差,来计算时间间隔。
time
通用格式化
time主要处理时间的获取和简单的格式化,如果需要更复杂的日期和时间操作,应该尝试使用datetime
常用的格式化字符串方式如下所示,并且datetime中同样也这样使用
%Y
:四位年份%m
:两位月份(01-12)%d
:两位日期(01-31)%H
:两位小时(00-23)%M
:两位分钟(00-59)%S
:两位秒(00-59)
时间戳
获取当前时间戳
import timetimestamp = time.time()
print("当前时间戳:", timestamp)
时间戳可以用于记录时间间隔,不过,如果要更精准的计时可以用
import timestart = time.perf_counter()
time.sleep(2)
end = time.perf_counter()
print(f"操作耗时: {end - start} 秒")
时间戳转为时间对象
时间戳转换为struct_time本地时间
timestamp = time.time()
local_time = time.localtime(timestamp)
print("本地时间:", local_time)
将时间戳转换为utc时间
timestamp = time.time()
utc_time = time.gmtime(timestamp)
print("UTC时间:", utc_time)
时间对象转为时间戳
import timestruct = time.strptime("2024-11-02 22:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(struct)
print("时间戳:", timestamp) # 时间戳: 1730556000.0
时间格式化
将一个时间戳快速转为可读时间
timestamp = time.time()
readable_time = time.ctime(timestamp)
print(readable_time) # 格式如Sat Nov 2 10:32:27 2024
time_str = "2024-11-02 22:00:00"
parsed_time = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")print(parsed_time)
根据时间对象,转为字符串
time_str = "2024-11-02 22:00:00"
parsed_time = time.strptime(time_str, "%Y-%m-%d %H:%M:%S")formatted_time = time.strftime("%Y年%m月%d日%H点%M分", parsed_time)
print("格式化时间:", formatted_time) # 格式化时间:2024年11月02日22点00分
时间暂停
时间是不会暂停的,实际上该功能是程序暂停
import timeprint("暂停前")
time.sleep(3) # 暂停3秒
print("暂停后")
datetime
date日期
获取当前日期
today = datetime.date.today()
print("今天的日期:", today) # 格式如2024-11-02
datetime日期时间
获取当前时间
now_time = datetime.datetime.now().time()
print("当前时间:", now_time) # 格式如10:46:50.506231
获取当前日期与时间
now = datetime.datetime.now()
print("当前日期和时间:", now) # 格式如2024-11-02 10:47:44.299445
获取UTC时间
utc_now = datetime.datetime.utcnow()
print("UTC时间:", utc_now)
创建日期时间对象
创建日期对象
specific_date = datetime.date(2024, 11, 2)
print("特定日期:", specific_date)
创建时间对象
specific_time = datetime.time(22, 0, 0)
print("特定时间:", specific_time)
创建日期时间对象
specific_datetime = datetime.datetime(2024, 11, 2, 22, 0, 0)
print("特定日期和时间:", specific_datetime)
时间字符串格式化与解析
时间字符串格式化
now = datetime.datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化日期时间:", formatted)
时间字符串解析
time_str = "2024-11-2 22:00:00"
parsed_datetime = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
print("解析后的日期时间对象:", parsed_datetime)
时间间隔
使用timedelta计算时间间隔的日期
from datetime import date, timedeltatoday = date.today()
future_date = today + timedelta(days=10)
print("10天后的日期:", future_date)past_date = today - timedelta(weeks=1)
print("一周前的日期:", past_date)
计算时间间隔的日期时间
from datetime import datetime, timedeltanow = datetime.now()future_time = now + timedelta(minutes=10)
print("10分钟后的日期时间:", future_time)past_time = now - timedelta(hours=2)
print("2小时前的日期时间:", past_time)
zoneinfo
时间转换
在python 3.9以后,引入了zoneinfo用于处理时区,并且能够直接用于datetime
from datetime import datetime
from zoneinfo import ZoneInfonow_utc = datetime.now(ZoneInfo("UTC"))
print("UTC时间:", now_utc)# 转换为北京时间
now_beijing = now_utc.astimezone(ZoneInfo("Asia/Shanghai"))
print("北京时间:", now_beijing)# 转换为纽约时间
now_newyork = now_utc.astimezone(ZoneInfo("America/New_York"))
print("纽约时间:", now_newyork)
实际上,时间转换也可以自行进行计算,例如,我们已经了解了北京时间是UTC+8,纽约时间是UTC-5
from datetime import datetime, timedeltanow_utc = datetime.utcnow()
print("UTC时间:", now_utc)now_beijing = now_utc + timedelta(hours=8)
print("北京时间:", now_beijing)now_newyork = now_utc - timedelta(hours=5)
print("纽约时间:", now_newyork)
列出所有时区
所有时区
import zoneinfoprint(zoneinfo.available_timezones())
遍历找到其中的Asia时区
import zoneinfofor zone in zoneinfo.available_timezones():if "Asia" in zone:print(zone)
获取时区时间
如果在使用当前时间的时候,总是自行设置本地时区的时间,而不依赖于机器设置,可以获得更好的跨平台性
from datetime import datetime
from zoneinfo import ZoneInfotz_shanghai = ZoneInfo("Asia/Shanghai")
tz_newyork = ZoneInfo("America/New_York")now_shanghai = datetime.now(tz_shanghai)
now_newyork = datetime.now(tz_newyork)print("北京时间:", now_shanghai)
print("纽约时间:", now_newyork)