Skip to content

Commit dea6552

Browse files
committed
时间的相关概念
1 parent 5882a6d commit dea6552

File tree

2 files changed

+176
-0
lines changed

2 files changed

+176
-0
lines changed

date_and_time/README.md

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
### ISO Format
2+
3+
```
4+
YYYY-MM-DDTHH:MM:SS[.nnnn][±HH:MM or Z]
5+
```
6+
7+
| 部分 | 含义 | 举例 |
8+
| -------- | --------------------------- | -------------------------- |
9+
| `YYYY` | 年份(4位) | `2025` |
10+
| `MM` | 月(2位) | `01`, `12` |
11+
| `DD` | 日(2位) | `01`, `28` |
12+
| `T` | 分隔符(Date 和 Time 之间) | 就是字母 `T` |
13+
| `hh` | 小时(24小时制) | `14`, `23` |
14+
| `mm` | 分钟 | `00`, `59` |
15+
| `ss` || `00`, `59` |
16+
| `.nnnn` | 小数秒(可选) | `14:30:45.1234` |
17+
| `±hh:mm` | 与 UTC 的偏移(时区) | `+08:00`, `-05:00` |
18+
| `Z` | 替代 `+00:00`,表示 UTC | 例:`2025-06-07T12:00:00Z` |
19+
20+
**冒号有时会被省略**`+0800` 等同于 `+08:00`
21+
22+
**小数秒是可选的**:通常用于精密记录,但可以不写。
23+
24+
**Z 是最常见的简写**:代表 UTC(协调世界时间)
25+
26+
✅ 举几个完整的例子:
27+
28+
| ISO 时间字符串 | 含义 |
29+
| --------------------------- | ------------------------------------- |
30+
| `2025-06-07T12:00:00Z` | UTC 时间中午 12 点 |
31+
| `2025-06-07T20:00:00+08:00` | 北京时间晚上 8 点 |
32+
| `2025-06-07T14:30:00-05:00` | 美中时间下午 2:30(比 UTC 晚 5 小时) |
33+
34+
```python
35+
from datetime import datetime
36+
37+
# ISO 格式的字符串
38+
iso_str = "2025-06-07T12:00:00Z"
39+
40+
# 解析成 datetime 对象(自动处理 Z)
41+
dt = datetime.fromisoformat(iso_str.replace("Z", "+00:00"))
42+
print("UTC 时间对象:", dt)
43+
44+
```
45+
dateutil
46+
能自动识别各种格式的字符串
47+
48+
```
49+
from dateutil import parser
50+
51+
dt = parser.parse("March 1, 2020 2:35:01pm")
52+
print(dt) # 2020-03-01 14:35:01
53+
```
54+
55+
pytz
56+
提供完整的时区支持,包括夏令时切换
57+
可以让你:
58+
给“无时区的时间”加上时区
59+
在时区之间做转换
60+
61+
```
62+
from datetime import datetime
63+
import pytz
64+
65+
tz = pytz.timezone("US/Eastern")
66+
dt = tz.localize(datetime(2020, 5, 1, 10, 23, 35)) # 自动处理夏令时
67+
print(dt.astimezone(pytz.utc)) # 转成 UTC 时间
68+
```
69+
70+
71+
最佳实践(Python 中):
72+
1.用户传入时间字符串
73+
2.用 dateutil.parser 解析为 datetime 对象
74+
3.用 pytz 加上合适的时区
75+
4.转为 UTC 保存
76+
5.需要展示时,再转成用户时区
77+
78+
### Epoch 时间(时间戳)
79+
80+
基准时间点是
81+
82+
```
83+
1970年1月1日 00:00:00 UTC
84+
```
85+
86+
Epoch Time 的定义:
87+
88+
+ 某个时间距离“epoch”的**总秒数**
89+
90+
比如:
91+
92+
+ `1970-01-01T00:00:00Z``0`
93+
+ `1970-01-01T00:00:01Z``1`
94+
+ `2020-05-01T14:23:35Z``1588343015.0`
95+
96+
+ 它是一个浮点数,单位是“秒”。
97+
98+
### datetime 模块
99+
100+
`datetime` 模块提供了 3 种主要对象类型:
101+
102+
| 类型 | 说明 | 示例 |
103+
| ---------- | ------------------- | --------------------- |
104+
| `date` | 只有日期(年月日) | `2025-06-07` |
105+
| `time` | 只有时间(时分秒) | `13:45:00` |
106+
| `datetime` | 同时包含日期 + 时间 | `2025-06-07 13:45:00` |
107+
108+
这个模块支持**时区处理**(配合 `timezone``pytz` 模块使用)。
109+
110+
-`datetime` 对象**加上时区信息**
111+
- 在多个时区之间**转换时间**
112+
113+
```python
114+
from datetime import datetime, timezone, timedelta
115+
116+
dt = datetime(2025, 6, 7, 10, 0, tzinfo=timezone.utc)
117+
print(dt) # 2025-06-07 10:00:00+00:00
118+
```
119+
120+
支持把时间对象:
121+
122+
- ➡️ **格式化为字符串**
123+
- ⬅️ **从字符串解析为时间对象**
124+
125+
✅ 格式化:
126+
127+
```
128+
python复制编辑dt.strftime("%Y-%m-%d %H:%M:%S")
129+
# 输出: '2025-06-07 13:45:00'
130+
```
131+
132+
✅ 解析:
133+
134+
```
135+
python复制编辑from datetime import datetime
136+
datetime.strptime("2025-06-07 13:45:00", "%Y-%m-%d %H:%M:%S")
137+
# 输出: datetime.datetime(2025, 6, 7, 13, 45, 0)
138+
```
139+
140+
⚠️ 缺点是 `strptime()` 需要你**明确知道格式**,不如 `dateutil.parser.parse()` 智能。
141+
142+
#### 例子
143+
144+
计算时间差
145+
146+
```python
147+
from datetime import datetime
148+
149+
start = datetime(2025, 6, 7, 8, 0)
150+
end = datetime(2025, 6, 7, 10, 30)
151+
152+
delta = end - start
153+
print(delta) # 2:30:00
154+
print(delta.total_seconds()) # 9000.0 秒
155+
```

date_and_time/introductions.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 接收到用户时间 → 转成 UTC
2+
# 程序内部只用 UTC 处理所有时间
3+
# 要显示给用户时 → 再转回用户的时区
4+
5+
# "3/1/2020 2:35:01 pm"
6+
# "2020-03-01T14:35:01Z"
7+
# "03-01-2020 02:35:01 PM"
8+
# "March 1, 2020 14:35:01"
9+
# 上边的字符串只是看起来像时间,但你还不能拿它们做时间计算(比如“加一天”),你必须先解析(parse)它,变成 datetime 对象
10+
11+
12+
time 模块
13+
1. 它大多数情况下是基于 Epoch Time时间戳来工作的
14+
2. 不支持时区
15+
3. 日期格式处理麻烦
16+
4. 不直观容易出错
17+
18+
import time
19+
20+
print(time.time())
21+
# 输出:1707428195.29383(这就是当前时间对应的“秒数”),这个 time.time() 就是从 1970-01-01 00:00:00 UTC 开始算的秒数。

0 commit comments

Comments
 (0)