mirror of
https://github.com/fastapi-practices/fastapi_best_architecture.git
synced 2025-08-18 06:42:51 +08:00
149 lines
4.3 KiB
Python
149 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
import datetime
|
|
|
|
import pytz
|
|
|
|
from backend.app.core.conf import settings
|
|
|
|
|
|
class TimeZoneUtils:
|
|
def __init__(self, timezone_str=settings.DATETIME_TIMEZONE):
|
|
self.timezone = pytz.timezone(timezone_str)
|
|
|
|
def get_timezone_datetime(self) -> datetime.datetime:
|
|
"""
|
|
获取时区时间
|
|
|
|
:return:
|
|
"""
|
|
return datetime.datetime.now(self.timezone)
|
|
|
|
def get_timezone_timestamp(self) -> int:
|
|
"""
|
|
获取时区时间戳 (秒)
|
|
|
|
:return:
|
|
"""
|
|
return int(self.get_timezone_datetime().timestamp())
|
|
|
|
def get_timezone_milliseconds(self) -> int:
|
|
"""
|
|
获取时区时间戳 (毫秒)
|
|
|
|
:return:
|
|
"""
|
|
return int(self.get_timezone_datetime().timestamp() * 1000)
|
|
|
|
def datetime_to_timezone_str(self, dt: datetime.datetime, format_str: str = settings.DATETIME_FORMAT) -> str:
|
|
"""
|
|
datetime 对象转时区时间字符串
|
|
|
|
:param dt:
|
|
:param format_str:
|
|
:return:
|
|
"""
|
|
return dt.astimezone(self.timezone).strftime(format_str)
|
|
|
|
def datetime_to_timezone_datetime(self, dt: datetime.datetime) -> datetime.datetime:
|
|
"""
|
|
datetime 对象转 datetime 时区对象
|
|
|
|
:param dt:
|
|
:return:
|
|
"""
|
|
return dt.astimezone(self.timezone)
|
|
|
|
@staticmethod
|
|
def datetime_to_timezone_utc(dt: datetime.datetime) -> datetime.datetime:
|
|
"""
|
|
datetime 对象转 datetime UTC 对象
|
|
|
|
:param dt:
|
|
:return:
|
|
"""
|
|
return dt.astimezone(pytz.utc)
|
|
|
|
def datetime_to_timezone_timestamp(self, dt: datetime.datetime) -> int:
|
|
"""
|
|
datetime 对象转时区时间戳(秒)
|
|
|
|
:param dt:
|
|
:return:
|
|
"""
|
|
return int(dt.astimezone(self.timezone).timestamp())
|
|
|
|
def datetime_to_timezone_milliseconds(self, dt: datetime.datetime) -> int:
|
|
"""
|
|
datetime 对象转时区时间戳(毫秒)
|
|
|
|
:param dt:
|
|
:return:
|
|
"""
|
|
return int(dt.astimezone(self.timezone).timestamp() * 1000)
|
|
|
|
def str_to_timezone_utc(self, time_str: str, format_str: str = settings.DATETIME_FORMAT) -> datetime.datetime:
|
|
"""
|
|
时间字符串转时区 datetime UTC 对象
|
|
|
|
:param time_str:
|
|
:param format_str:
|
|
:return:
|
|
"""
|
|
dt = datetime.datetime.strptime(time_str, format_str).replace(tzinfo=self.timezone)
|
|
return self.datetime_to_timezone_utc(dt)
|
|
|
|
def str_to_timezone_datetime(self, time_str: str, format_str: str = settings.DATETIME_FORMAT) -> datetime.datetime:
|
|
"""
|
|
时间字符串转 datetime 时区对象
|
|
|
|
:param time_str:
|
|
:param format_str:
|
|
:return:
|
|
"""
|
|
return datetime.datetime.strptime(time_str, format_str).replace(tzinfo=self.timezone)
|
|
|
|
def utc_datetime_to_timezone_datetime(self, utc_time: datetime.datetime) -> datetime.datetime:
|
|
"""
|
|
datetime UTC 对象转 datetime 时区对象
|
|
|
|
:param utc_time:
|
|
:return:
|
|
"""
|
|
return utc_time.replace(tzinfo=pytz.utc).astimezone(self.timezone)
|
|
|
|
def utc_timestamp_to_timezone_datetime(self, timestamp: int) -> datetime.datetime:
|
|
"""
|
|
时间戳转 datetime 时区对象
|
|
|
|
:param timestamp:
|
|
:return:
|
|
"""
|
|
utc_datetime = datetime.datetime.utcfromtimestamp(timestamp).replace(tzinfo=pytz.utc)
|
|
return self.datetime_to_timezone_datetime(utc_datetime)
|
|
|
|
def get_timezone_expire_time(self, expires_delta: datetime.timedelta) -> datetime.datetime:
|
|
"""
|
|
获取时区过期时间
|
|
|
|
:param expires_delta:
|
|
:return:
|
|
"""
|
|
return self.get_timezone_datetime() + expires_delta
|
|
|
|
def get_timezone_expire_seconds(self, expire_datetime: datetime.datetime) -> int:
|
|
"""
|
|
获取从指定时间开始到当前时间的时间间隔(秒)
|
|
|
|
:param expire_datetime: 指定时间的 datetime 对象
|
|
:return: 时间间隔(秒)
|
|
"""
|
|
timezone_datetime = self.get_timezone_datetime()
|
|
expire_datetime = self.datetime_to_timezone_datetime(expire_datetime)
|
|
if expire_datetime < timezone_datetime:
|
|
return 0
|
|
return int((expire_datetime - timezone_datetime).total_seconds())
|
|
|
|
|
|
timezone_utils = TimeZoneUtils()
|