Source code for bTagScript.block.strf_block

from datetime import datetime, timezone
from typing import Optional

from ..interface import Block
from ..interpreter import Context


[docs]class StrfBlock(Block): """ The strf block converts and formats timestamps based on `strftime formatting spec <https://strftime.org/>`_. Two types of timestamps are supported: ISO and epoch. If a timestamp isn't passed, the current UTC time is used. Invoking this block with `unix` will return the current Unix timestamp. **Usage:** ``{strf([timestamp]):<format>}`` **Aliases:** ``unix`` **Payload:** ``format`` **Parameter:** ``timestamp`` **Example:** .. tagscript:: {strf:%Y-%m-%d} 2021-07-11 {strf({user(timestamp)}):%c} Fri Jun 29 21:10:28 2018 {strf(1420070400):%A %d, %B %Y} Thursday 01, January 2015 {strf(2019-10-09T01:45:00.805000):%H:%M %d-%B-%Y} 01:45 09-October-2019 {unix} 1629182008 """ ACCEPTED_NAMES = ("strf", "unix")
[docs] def process(self, ctx: Context) -> Optional[str]: """ Process the strf block """ if ctx.verb.declaration.lower() == "unix": return str(int(datetime.now(timezone.utc).timestamp())) if not ctx.verb.payload: return None if ctx.verb.parameter: if ctx.verb.parameter.isdigit(): try: t = datetime.fromtimestamp(int(ctx.verb.parameter)) except: # pylint: disable=bare-except return else: try: t = datetime.fromisoformat(ctx.verb.parameter) # converts datetime.__str__ to datetime except ValueError: return else: t = datetime.now() if not t.tzinfo: t = t.replace(tzinfo=timezone.utc) return t.strftime(ctx.verb.payload)