|
| 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 | +``` |
0 commit comments