Files

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()