# Datetime - 日期時間理論
`src/planner/datetime.rs`
## 日期時間的複雜性
日期時間處理遠比表面複雜:
1. **日曆的歷史問題** - 1582 年前無格里珠
2. **時區** - 地球分為 24 時區
3. **夏令時** - 每年兩次調整
4. **閏秒** - 不規律的調整
## 儒略日 (Julian Day)
從公元前 4713 年 1 月 1 日起的連續天數:
```
JD = 当前日期距離 4713 BC 的天數
```
### 為何需要儒略日?
- 跨越千年的日期計算
- 天文學廣泛使用
```
JULIANDAY('2024-01-15') ≈ 2460315.5
```
## 格里曆 (Gregorian Calendar)
現今使用的標準日曆:
```
年份 ÷ 400 = 閏年
年份 ÷ 100 ≠ 閏年
年份 ÷ 4 = 閏年
```
閏年規則:
- 400 的倍數:閏年
- 100 的倍數:平年
- 4 的倍數:閏年
## 夏令時 (DST)
夏季時間往前移動 1 小時:
| 美國 | 3月第二週日凌晨 2:00 → 3:00 |
| 歐盟 | 3月最後週日凌晨 2:00 → 3:00 |
| 台灣 | 不實行 |
問題:轉換時刻的時間處理
## 時區表示
### UTC (Coordinated Universal Time)
世界標準時間
### 偏移量
```
UTC+8 → 北京時間
UTC-5 → 紐約時間(標準)
```
### IANA 時區資料庫
```
America/New_York
Asia/Taipei
```
## 日期時間格式
### ISO 8601
```
2024-01-15T12:30:45Z
↑ ↑
日期時間分隔 UTC 標記
```
### STRFTIME 格式碼
| %Y | 4 位年 | 2024 |
| %m | 2 位月 | 01-12 |
| %d | 2 位日 | 01-31 |
| %H | 24 小時 | 00-23 |
| %M | 分 | 00-59 |
| %S | 秒 | 00-59 |
## SQLite 的日期時間
SQLite 没有專用的 DATETIME 類型,而是:
- 儲存為 TEXT、REAL 或 INTEGER
- 依賴函數進行計算
## 理論參考
- Dershowitz & Reingold, "Calendrical Calculations"
- ISO 8601: Date and Time Format
- IANA Time Zone Database