基础日期时间函数
时间格式术语表
常见时间格式
- ISO 8601: 国际标准日期时间格式
- 基本格式:
YYYY-MM-DDTHH:MM:SS.sss+HH:MM
- 示例:
2023-07-30T10:15:30.000+08:00
- T: 日期和时间的分隔符
- Z: 表示 UTC 时间(零时区),等同于 +00:00
- 基本格式:
时区相关
- UTC (Coordinated Universal Time): 协调世界时,全球时间标准
- GMT (Greenwich Mean Time): 格林威治标准时间,实际使用中常与 UTC 等同
- CST (China Standard Time): 中国标准时间,UTC+8
- 也写作
UTC+8
或+0800
- 例:北京时间比 UTC 快 8 小时
- 也写作
时间戳
- Unix 时间戳: 从 1970-01-01 00:00:00 UTC 开始的秒数
- 秒级时间戳:10位数字(如:1627689600)
- 毫秒级时间戳:13位数字(如:1627689600000)
- 纳秒级时间戳:19位数字
常见时间格式化字符
- YYYY: 四位年份(2023)
- MM: 两位月份(01-12)
- DD: 两位日期(01-31)
- HH: 24小时制(00-23)
- MM: 分钟(00-59)
- SS: 秒钟(00-59)
- sss: 毫秒(000-999)
基础日期时间函数
python
from datetime import datetime, date, timedelta, timezone
def iso8601_to_timestamp_ms(time_format: str) -> str:
"""
将 ISO8601 格式的时间(带时区)转换为毫秒级时间戳字符串。
例: '2022-06-27T17:30:31.96+08:00' -> '1656322231000'
"""
if time_format:
ts = datetime.strptime(time_format, "%Y-%m-%dT%H:%M:%S.%f%z").timestamp()
return str(int(ts)) + "000"
return ""
def get_today_iso_date() -> str:
"""返回今天的日期(YYYY-MM-DD)。"""
return str(date.today())
def get_yesterday_compact() -> str:
"""返回昨天的日期(YYYYMMDD)。"""
return (date.today() - timedelta(days=1)).strftime("%Y%m%d")
def get_today_iso_format() -> str:
"""返回今天的日期 ISO 格式(YYYY-MM-DD)。"""
return date.today().isoformat()
时区与时间格式化
python
def convert_to_cst(time_with_zone: str) -> str:
"""
将带时区的时间转换为东八区(CST)时间,返回格式:'YYYY-MM-DD HH:MM:SS'
"""
d = datetime.fromisoformat(time_with_zone) + timedelta(hours=8)
return d.isoformat(timespec='seconds', sep=" ").split('+')[0]
def get_current_cst() -> str:
"""返回当前东八区时间,格式:'YYYY-MM-DD HH:MM:SS'"""
return (datetime.utcnow() + timedelta(hours=8)).isoformat(sep=' ', timespec='seconds')
def get_current_cst_with_zone() -> str:
"""返回当前东八区时间,并带 '+0800' 时区信息。"""
t = (datetime.utcnow() + timedelta(hours=8)).isoformat(sep=" ", timespec="seconds")
return f"{t} +0800"
def timestamp_to_cst(timestamp: int) -> str:
"""
将 Unix 时间戳(秒)转换为东八区时间。
输出格式:'YYYY-MM-DD HH:MM:SS'
"""
return datetime.fromtimestamp(timestamp, tz=timezone.utc) \
.astimezone(timezone(timedelta(hours=8))) \
.strftime(r"%Y-%m-%d %H:%M:%S")
获取过去时间
python
from datetime import datetime, timedelta, timezone
def get_time_minus_8hours() -> str:
"""
获取当前时间的 8 小时前(约等于 CST)的时间戳,返回格式 'YYYY-MM-DD HH:MM:SS'。
"""
cst_offset = timezone(timedelta(hours=8))
utc_now = datetime.now(timezone.utc)
eight_hours_ago_utc = utc_now - timedelta(minutes=60 * 8)
eight_hours_ago_cst = eight_hours_ago_utc.astimezone(cst_offset)
iso_format_string = eight_hours_ago_cst.isoformat(sep=" ", timespec="seconds")
return iso_format_string.split('+')[0]
def get_time_minus_8hours() -> str:
"""
获取当前 UTC 时间的 8 小时前,返回格式 'YYYY-MM-DD HH:MM:SS'
"""
return (datetime.utcnow() - timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
def get_time_minus_8hours() -> str:
"""
获取当前 UTC 时间的 8 小时前,返回格式 'YYYY-MM-DD HH:MM:SS'
"""
return datetime.now(timezone.utc) \
.astimezone() \
.replace(tzinfo=None) \
- timedelta(hours=8) \
.strftime("%Y-%m-%d %H:%M:%S")
时间字符串解析
python
import re
from dateutil import parser
def parse_gmt_to_cst(time_format: str) -> datetime:
"""
解析 GMT 格式时间并转换为东八区时间。
输入: 'Jun 1 05:46:49 2022 GMT'
"""
return datetime.strptime(time_format, '%b %d %H:%M:%S %Y GMT') + timedelta(hours=8)
def parse_dotnet_timestamp(time_created: str) -> str:
"""
解析形如 '/Date(1680604245507)/' 的时间戳为可读时间。
"""
try:
ts = int(re.search(r'\d+', time_created).group()) / 1000.0
return datetime.fromtimestamp(ts).isoformat(sep=" ", timespec='seconds')
except Exception:
return ''
ISO 时间字符串解析
python
def parse_iso_nano_to_cst(time_string: str) -> str:
"""
解析 ISO8601 带纳秒时间,自动转换为东八区时间。
例: '2023-05-19T10:31:41.587456400Z'
"""
try:
parsed_dt = parser.isoparse(time_string)
tz = timezone(timedelta(hours=8))
return parsed_dt.astimezone(tz).strftime("%Y-%m-%d %H:%M:%S")
except ValueError:
return ''
def extract_iso_time_to_cst(text: str) -> str:
"""
从文本中提取 ISO8601 时间并格式化为东八区时间。
"""
match = re.search(r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{9}Z', text)
if match:
return parse_iso_nano_to_cst(match.group())
return ''