Python 的 time 模块提供了各种与时间相关的函数。这些函数可以用来获取当前时间、操作时间和日期、将时间转换为不同的格式等。
在 time 模块中,时间通常有两种表示方式:
time.time() 函数返回当前时间的时间戳(浮点数),即从1970年1月1日00:00:00(称为Unix纪元或Epoch时间)起至现在的秒数。
import time
# 获取当前时间的时间戳
current_timestamp = time.time()
print("当前时间戳:", current_timestamp)
#输出结果:当前时间戳: 1696416612.345678 # 这里的数字是一个示例,实际运行时会得到不同的时间戳
将时间戳转换为本地时间的结构化时间。
time.localtime([secs]) 函数将一个时间戳(默认为当前时间)转换为一个本地时间的结构化时间(struct_time)。
import time
# 获取当前时间的时间戳
current_timestamp = time.time()
# 将时间戳转换为本地时间的结构化时间
local_time = time.localtime(current_timestamp)
print("本地时间结构化表示:", local_time)
# 访问结构化时间中的各个元素
print("年:", local_time.tm_year)
print("月:", local_time.tm_mon)
print("日:", local_time.tm_mday)
print("小时:", local_time.tm_hour)
print("分钟:", local_time.tm_min)
print("秒:", local_time.tm_sec)
print("星期几:", local_time.tm_wday) # 0代表星期一,6代表星期日
print("一年中的第几天:", local_time.tm_yday)
print("夏令时标志:", local_time.tm_isdst) # 0代表非夏令时,-1代表信息无效,1代表夏令时
# 输出结果
#本地时间结构化表示: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=4, tm_hour=14, tm_min=30, tm_sec=12, tm_wday=2, tm_yday=277, tm_isdst=0)
#年: 2023
#月: 10
#日: 4
#小时: 14
#分钟: 30
#秒: 12
#星期几: 2 # 代表星期二
#一年中的第几天: 277
#夏令时标志: 0 # 代表非夏令时
将时间戳转换为UTC时间的结构化时间。
time.gmtime([secs]) 函数将一个时间戳(默认为当前时间)转换为一个UTC时间的结构化时间(struct_time)。
import time
# 获取当前时间的时间戳
current_timestamp = time.time()
# 将时间戳转换为UTC时间的结构化时间
utc_time = time.gmtime(current_timestamp)
print("UTC时间结构化表示:", utc_time)
# 访问结构化时间中的各个元素(与localtime相同)
print("年:", utc_time.tm_year)
# ...(其他元素类似)
# 输出结果
#UTC时间结构化表示: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=4, tm_hour=6, tm_min=30, tm_sec=12, tm_wday=2, tm_yday=277, tm_isdst=0)
年: 2023
# ...(其他元素的值会根据当前UTC时间而变化)
注意:由于UTC时间与本地时间可能存在时区差异,因此tm_hour等时间元素的值可能与localtime的结果不同。
在 strftime 和 strptime 函数中,格式化字符串用于指定时间的格式。以下是一些常用的格式化指令:
符号 | 符号描述 | 举例 |
---|---|---|
%a | 本地(locale)的简化星期名称 | Mon, Tue, …, Sun |
%A | 本地完整星期名称 | Monday, Tuesday, …, Sunday |
%b | 本地简化的月份名称 | Jan, Feb, …, Dec |
%B | 本地完整的月份名称 | January, February, …, December |
%c | 本地相应的日期和时间表示 | 例如: Tue Aug 16 01:30:00 1988(注意:实际输出取决于locale) |
%d | 一个月中的第几天(01-31) | 01, 02, …, 31 |
%H | 一天中的第几个小时(24小时制,00-23) | 00, 01, …, 23 |
%I | 一天中的第几个小时(12小时制,01-12) | 01, 02, …, 12 |
%j | 一年中的第几天(001-366) | 001, 002, …, 366 |
%m | 月份(01-12) | 01, 02, …, 12 |
%M | 分钟数(00-59) | 00, 01, …, 59 |
%p | 本地am或pm的相应符 | AM, PM |
%S | 秒(00-61,60和61是为了考虑闰秒的情况) | 00, 01, …, 61(注意:通常秒数为00-59,60和61仅在闰秒时出现) |
%U | 一年中的第几周(00-53,星期天为一周的开始) | 00, 01, …, 53 |
%w | 一周中的第几天(0-6,0为星期天) | 0, 1, …, 6 |
%W | 一年中的第几周(00-53,星期一为一周的开始) | 00, 01, …, 53 |
%x | 本地相应的日期表示(取决于locale) | 例如: 08/16/88(实际输出取决于locale) |
%X | 本地相应的时间表示(取决于locale) | 例如: 01:30:00(实际输出取决于locale) |
%y | 两位数的年份表示(00-99) | 00, 01, …, 99 |
%Y | 四位数的年份表示 | 2023, 1988 |
%Z | 时区的名字(如果不存在为空字符串) | UTC, CST, … |
%% | 一个百分号字符 | % |
将时间元组(struct_time)或默认当前时间转换为一个格式化的时间字符串。
根据format指定的格式,将时间元组t转换为一个字符串。
import time
# 获取当前时间的时间元组
current_time = time.localtime()
# 格式化时间字符串
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
# 打印格式化后的时间字符串
print(f"Formatted Time: {formatted_time}") # 例如: Formatted Time: 2023-10-05 14:30:00
# 输出结果:输出的时间字符串将基于当前系统时间,格式如2023-10-05 14:30:00。
根据指定的格式解析时间字符串,返回对应的时间元组(struct_time)。
将符合format格式的时间字符串string解析为一个时间元组。
import time
# 时间字符串
time_string = "2023-10-05 14:30:00"
# 解析时间字符串为时间元组
parsed_time = time.strptime(time_string, "%Y-%m-%d %H:%M:%S")
# 打印解析后的时间元组
print(f"Parsed Time Tuple: {parsed_time}") # 例如: Parsed Time Tuple: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=5, tm_hour=14, tm_min=30, tm_sec=0, tm_wday=4, tm_yday=278, tm_isdst=0)
# 也可以将解析后的时间元组转换回格式化的时间字符串以验证
verified_time_string = time.strftime("%Y-%m-%d %H:%M:%S", parsed_time)
print(f"Verified Time String: {verified_time_string}") # 例如: Verified Time String: 2023-10-05 14:30:00
struct_time是一个命名元组(named tuple),用于表示时间。它通常是通过time.localtime()、time.gmtime()或time.strptime()等函数返回的。
虽然struct_time是一个命名元组,但它不支持直接修改其字段。如果需要修改时间,可以创建一个新的struct_time对象或使用其他时间处理函数。
返回当前时间的时间戳(浮点数)。
import time
# 获取当前时间的时间戳
current_timestamp = time.time()
# 打印当前时间戳
print(f"Current Timestamp: {current_timestamp}") # 例如: Current Timestamp: 1696514230.123456
将时间戳转换为本地时间或UTC时间的struct_time对象。
import time
# 获取当前时间的时间戳
current_timestamp = time.time()
# 将时间戳转换为本地时间
local_time = time.localtime(current_timestamp)
# 将时间戳转换为UTC时间
utc_time = time.gmtime(current_timestamp)
# 打印本地时间和UTC时间
print(f"Local Time: {local_time}") # 例如: Local Time: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=6, tm_hour=10, tm_min=30, tm_sec=12, tm_wday=4, tm_yday=279, tm_isdst=0)
print(f"UTC Time: {utc_time}") # 例如: UTC Time: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=6, tm_hour=2, tm_min=30, tm_sec=12, tm_wday=4, tm_yday=279, tm_isdst=0)
将struct_time对象转换为时间戳。
将时间元组转换为对应的Unix时间戳。
import time
# 创建一个时间元组
time_tuple = time.struct_time((2023, 10, 6, 10, 30, 12, 4, 279, 0))
# 将时间元组转换为时间戳
timestamp = time.mktime(time_tuple)
# 打印转换后的时间戳
print(f"Timestamp from Time Tuple: {timestamp}") # 例如: Timestamp from Time Tuple: 1696573812.0
由于时间戳是一个浮点数,因此可以直接进行加减运算来表示时间的增加或减少。例如,加上3600秒表示增加一小时,减去86400秒表示减少一天。
import time
# 获取当前时间的时间戳
current_timestamp = time.time()
# 增加一小时(3600秒)
future_timestamp = current_timestamp + 3600
# 减少一天(86400秒)
past_timestamp = current_timestamp - 86400
# 将时间戳转换为可读的时间元组
future_time = time.localtime(future_timestamp)
past_time = time.localtime(past_timestamp)
# 打印结果
print(f"Current Time: {time.localtime(current_timestamp)}") # 例如: Current Time: time.struct_time(tm_year=2023, tm_mon=10, tm_mday=6, tm_hour=10, tm_min=50, tm_sec=34, tm_wday=4, tm_yday=279, tm_isdst=0)
print(f"Future Time (1 hour later): {future_time}") # 例如: Future Time (1 hour later): time.struct_time(tm_year=2023, tm_mon=10, tm_mday=6, tm_hour=11, tm_min=50, tm_sec=34, tm_wday=4, tm_yday=279, tm_isdst=0)
print(f"Past Time (1 day earlier): {past_time}") # 例如: Past Time (1 day earlier): time.struct_time(tm_year=2023, tm_mon=10, tm_mday=5, tm_hour=10, tm_min=50, tm_sec=34, tm_wday=3, tm_yday=278, tm_isdst=0)
在Python中,time模块提供了一些用于延迟执行或暂停程序运行的函数。这些函数通常用于在程序执行中插入等待时间,例如在循环之间等待、模拟延迟或在调试期间暂停程序。
time.sleep() 是最常用的延迟函数,它会使程序暂停指定的秒数。这个函数接受一个浮点数作为参数,可以是小数,以秒为单位。
import time
print("程序开始")
time.sleep(2) # 暂停2秒
print("2秒后程序继续")
注意事项:
虽然 time.sleep() 主要接受秒作为参数,但你可以通过传递纳秒数(通过除以 1e9 转换为秒)来实现更精确的延迟。time.perf_counter_ns() 可以用于获取高精度的时间戳(以纳秒为单位),尽管它本身并不用于延迟,但可以用来测量延迟的准确性。
import time
start_time = time.perf_counter_ns()
# 延迟100毫秒(100,000,000纳秒)
time.sleep(100_000_000 / 1e9)
end_time = time.perf_counter_ns()
elapsed_time = (end_time - start_time) / 1e6 # 转换为毫秒
print(f"延迟了 {elapsed_time:.2f} 毫秒")
import time
# 获取开始时间的时间戳
start_time = time.time()
# 放置你要测量执行时间的代码块
# 例如,一个简单的循环
for i in range(1000000):
pass
# 获取结束时间的时间戳
end_time = time.time()
# 计算执行时间
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time:.6f} 秒")
import time
这是使用time模块中的函数的前提。
start_time = time.time()
time.time()函数返回当前时间的时间戳(即从1970年1月1日00:00:00起至现在的秒数)。这个时间戳作为代码块开始执行的时间点。
for i in range(1000000):
pass
我们用一个简单的空循环来模拟需要测量执行时间的代码块。你可以替换成任何你想测量的代码。
end_time = time.time()
同样使用time.time()函数来获取代码块执行结束后的时间戳。
execution_time = end_time - start_time
通过计算结束时间和开始时间的差值,得到代码块的执行时间。
print(f"代码执行时间: {execution_time:.6f} 秒")
使用格式化字符串(f-string)来打印执行时间,并保留6位小数。
如果你需要更高精度的测量,可以使用time.perf_counter():
import time
# 获取开始时间
start_time = time.perf_counter()
# 放置你要测量执行时间的代码块
for i in range(1000000):
pass
# 获取结束时间
end_time = time.perf_counter()
# 计算执行时间
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time:.6f} 秒")
time.perf_counter()提供了一个更精确的计数器,适合测量短时间间隔。它通常比time.time()更适合用于性能测量。
在Python中,处理时间和时区转换通常涉及两个主要的模块:time 和 pytz。虽然 time 模块提供了基本的日期和时间功能,但处理时区转换时,pytz 模块通常更为强大和方便。
首先,你需要安装 pytz 模块。如果你还没有安装,可以使用 pip 来安装:
pip install pytz
from datetime import datetime
import pytz
# 获取当前UTC时间
utc_now = datetime.utcnow()
# 定义时区
tz_new_york = pytz.timezone('America/New_York')
tz_tokyo = pytz.timezone('Asia/Tokyo')
# 将UTC时间转换为纽约时间
ny_time = utc_now.astimezone(tz_new_york)
# 将UTC时间转换为东京时间
tokyo_time = utc_now.astimezone(tz_tokyo)
print("UTC Time:", utc_now)
print("New York Time:", ny_time)
print("Tokyo Time:", tokyo_time)
如果你有一个非UTC时间,并且想将其转换为另一个时区,可以先将其转换为UTC时间,然后再转换为目标时区。
from datetime import datetime
import pytz
# 定义一个非UTC时间(例如纽约时间)
ny_time_str = '2023-10-05 14:30:00'
ny_time_fmt = '%Y-%m-%d %H:%M:%S'
ny_time_obj = datetime.strptime(ny_time_str, ny_time_fmt)
# 定义纽约时区
tz_new_york = pytz.timezone('America/New_York')
# 将纽约时间转换为UTC时间
ny_time_aware = tz_new_york.localize(ny_time_obj)
utc_time = ny_time_aware.astimezone(pytz.utc)
# 定义目标时区(例如东京时区)
tz_tokyo = pytz.timezone('Asia/Tokyo')
# 将UTC时间转换为东京时间
tokyo_time = utc_time.astimezone(tz_tokyo)
print("Original New York Time:", ny_time_obj)
print("Converted UTC Time:", utc_time)
print("Converted Tokyo Time:", tokyo_time)
可以使用pytz.all_timezones来获取pytz支持的所有时区的列表。这个列表包含了IANA时区数据库中所有时区的字符串表示。
import pytz
# 获取所有时区的列表
all_timezones = pytz.all_timezones
# 打印时区列表
for tz in all_timezones:
print(tz)