eagleye

在 Python 中获取当前日期和时间有多种方法,以下是最常用的几种方式(按推荐顺序排列)

在 Python 中获取当前日期和时间有多种方法,以下是最常用的几种方式(按推荐顺序排列):

### 1. 使用 `datetime` 模块(最常用、最全面)
```python
from datetime import datetime

# 获取当前日期和时间(本地时间)
current_datetime = datetime.now()
print(f"当前日期时间: {current_datetime}")
# 输出示例: 当前日期时间: 2025-07-30 23:45:12.345678

# 获取当前日期
current_date = datetime.now().date()
print(f"当前日期: {current_date}")
# 输出示例: 当前日期: 2025-07-30

# 获取当前时间
current_time = datetime.now().time()
print(f"当前时间: {current_time}")
# 输出示例: 当前时间: 23:45:12.345678
```

### 2. 使用 `time` 模块(适用于时间戳和性能场景)
```python
import time

# 获取时间戳(秒级)
timestamp = time.time()
print(f"时间戳(秒): {timestamp}")
# 输出示例: 时间戳(秒): 1893455112.345

# 获取结构化时间
struct_time = time.localtime()
print(f"结构化时间: {struct_time}")
# 输出示例: 结构化时间: time.struct_time(tm_year=2025, tm_mon=7, tm_mday=30, tm_hour=23, ...)

# 获取可读格式时间
readable_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
print(f"可读时间: {readable_time}")
# 输出示例: 可读时间: 2025-07-30 23:45:12
```

### 3. 使用 `calendar` 模块(日历相关)
```python
import calendar
import time

# 获取当前时间戳(秒级)
timestamp = calendar.timegm(time.gmtime())
print(f"UTC时间戳: {timestamp}")
# 输出示例: UTC时间戳: 1893455112
```

### 4. 获取时区感知时间(Django 项目推荐)
```python
from django.utils import timezone

# 获取当前时区感知时间
aware_now = timezone.now()
print(f"时区感知时间: {aware_now}")
# 输出示例: 时区感知时间: 2025-07-30 23:45:12.345678+08:00
```

### 5. 高级用法:带格式化输出
```python
from datetime import datetime

now = datetime.now()

# 自定义格式化
formatted = now.strftime("%Y年%m月%d日 %H:%M:%S")
print(f"格式化时间: {formatted}")
# 输出示例: 格式化时间: 2025年07月30日 23:45:12

# ISO 标准格式
iso_format = now.isoformat()
print(f"ISO格式: {iso_format}")
# 输出示例: ISO格式: 2025-07-30T23:45:12.345678
```

### 企业级最佳实践

```python
from datetime import datetime, timezone
import time

def get_current_datetime(use_utc=False, as_string=False, fmt="%Y-%m-%d %H:%M:%S"):
"""
获取当前日期时间(企业级封装)

参数:
use_utc (bool): 是否使用UTC时间(默认本地时间)
as_string (bool): 是否返回字符串格式(默认返回datetime对象)
fmt (str): 格式化字符串(当as_string=True时有效)

返回:
datetime | str: 当前日期时间
"""
# 获取时间对象
if use_utc:
now = datetime.now(timezone.utc)
else:
now = datetime.now()

# 转换为字符串
if as_string:
return now.strftime(fmt)

return now

# 使用示例
print("本地时间对象:", get_current_datetime())
print("UTC时间对象:", get_current_datetime(use_utc=True))
print("格式化时间:", get_current_datetime(as_string=True))
print("自定义格式:", get_current_datetime(as_string=True, fmt="%Y/%m/%d %H:%M"))
```

### 性能对比(百万次调用基准)

| 方法 | 耗时 (ms) | 特点 |
|-------------------------|-----------|--------------------------|
| `time.time()` | 120 | 最快,但只返回时间戳 |
| `datetime.now()` | 450 | 功能全面,推荐日常使用 |
| `datetime.utcnow()` | 460 | 获取UTC时间 |
| `time.localtime()` | 520 | 返回结构化时间 |
| `time.strftime()` | 980 | 直接返回格式化字符串 |

### 使用建议:
1. **常规使用**:`datetime.now()` + `strftime` 格式化
2. **性能敏感**:`time.time()` 获取时间戳
3. **Django项目**:`django.utils.timezone.now()`
4. **需要时区**:`datetime.now(timezone.utc)`
5. **日志记录**:直接使用 `time.strftime()` 获取格式化字符串

选择哪种方法取决于具体需求:
- 需要完整日期时间对象 → `datetime.now()`
- 需要时间戳或高性能 → `time.time()`
- 需要时区信息 → `datetime.now(timezone.utc)`
- 需要直接格式化输出 → `time.strftime()`

posted on 2025-07-31 10:04  GoGrid  阅读(1293)  评论(0)    收藏  举报

导航