Add timezone option
This commit is contained in:
parent
991a29e484
commit
d737e29c6f
4 changed files with 42 additions and 13 deletions
|
|
@ -1,8 +1,21 @@
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from zoneinfo import ZoneInfo
|
from zoneinfo import ZoneInfo, available_timezones
|
||||||
|
|
||||||
utc = ZoneInfo('UTC')
|
ALLOWED_TIMEZONES = available_timezones()
|
||||||
|
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
|
||||||
|
|
||||||
|
|
||||||
|
def tz_aware_now(zone: str) -> datetime:
|
||||||
|
"""
|
||||||
|
:param str zone: Zone name in DB
|
||||||
|
:return: A timezone aware datetime object
|
||||||
|
:raises: ValueError When zone name is not supported
|
||||||
|
"""
|
||||||
|
# ZoneInfo uses a weak cache, no need to implement a local cache
|
||||||
|
if zone not in ALLOWED_TIMEZONES:
|
||||||
|
raise ValueError(f'Unsupported timezone "{zone}"')
|
||||||
|
return datetime.now(tz=ZoneInfo(zone))
|
||||||
|
|
||||||
|
|
||||||
def real_utc_now() -> datetime:
|
def real_utc_now() -> datetime:
|
||||||
return datetime.now(tz=utc)
|
return tz_aware_now('UTC')
|
||||||
|
|
|
||||||
11
time_app/helpers/views.py
Normal file
11
time_app/helpers/views.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
from fastapi import HTTPException
|
||||||
|
|
||||||
|
from .datetime import tz_aware_now
|
||||||
|
|
||||||
|
|
||||||
|
def get_now_in_view(zone: str = 'UTC'):
|
||||||
|
try:
|
||||||
|
now = tz_aware_now(zone=zone)
|
||||||
|
except ValueError:
|
||||||
|
raise HTTPException(status_code=400, detail=f'Zone "{zone}" is unsupported')
|
||||||
|
return now
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
|
|
||||||
from time_app.helpers.datetime import real_utc_now
|
from time_app.helpers.views import get_now_in_view
|
||||||
from time_app.models.main import Now
|
from time_app.models.main import Now
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
@router.get('/', name='Now', response_model=Now)
|
@router.get('/now', name='Now', response_model=Now)
|
||||||
def now_view() -> dict:
|
def now_view(zone: str = 'UTC') -> dict:
|
||||||
return {"time": real_utc_now().strftime('%Y-%m-%d %H:%M:%S')}
|
return {"time": f'{get_now_in_view(zone):%Y-%m-%d %H:%M:%S}'}
|
||||||
|
|
||||||
|
|
||||||
@router.get('/diy', name='Day in year', response_model=Now)
|
@router.get('/diy', name='Day in year', response_model=Now)
|
||||||
def day_in_year_view() -> dict:
|
def day_in_year_view(zone: str = 'UTC') -> dict:
|
||||||
return {"time": real_utc_now().strftime('%y%j')[-4:]}
|
return {"time": f'{get_now_in_view(zone):%y%j}'[-4:]}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,20 @@
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
|
|
||||||
from time_app.helpers.datetime import real_utc_now
|
from time_app.helpers.views import get_now_in_view
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
@router.get('/', name='Now')
|
@router.get('/', name='Now')
|
||||||
def now_view() -> str:
|
def now_view() -> str:
|
||||||
return real_utc_now().strftime('%Y-%m-%d %H:%M:%S')
|
return f'{get_now_in_view():%Y-%m-%d %H:%M:%S}'
|
||||||
|
|
||||||
|
|
||||||
|
@router.get('/now', name='Now')
|
||||||
|
def now_view(zone: str = 'UTC') -> str:
|
||||||
|
return f'{get_now_in_view(zone):%Y-%m-%d %H:%M:%S}'
|
||||||
|
|
||||||
|
|
||||||
@router.get('/diy', name='Day in year')
|
@router.get('/diy', name='Day in year')
|
||||||
def day_in_year_view() -> str:
|
def day_in_year_view(zone: str = 'UTC') -> str:
|
||||||
return real_utc_now().strftime('%y%j')[-4:]
|
return f'{get_now_in_view(zone):%y%j}'[-4:]
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue