Skip to content

基础日期时间函数

时间格式术语表

常见时间格式

  • 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 ''

Released under the MIT License.