audrey.feldroy.com

The experimental notebooks of Audrey M. Roy Greenfeld. This website and all its notebooks are open-source at github.com/audreyfeldroy/audrey.feldroy.com


# FastHTML and MonsterUI Time Converter

by Audrey M. Roy Greenfeld | Mon, Feb 3, 2025

A FastHTML app that converts times to different timezones, and to Discord timestamps.


from datetime import datetime
from fastcore.utils import *
from fasthtml.common import *
from fasthtml.jupyter import *
from monsterui.all import *
from zoneinfo import ZoneInfo

Bring Over Time Conversion Functions

This code is from Functional Programming with datetime, and Omni-Timezone Discord Timestamps.

#| export
tzs = L('America/Los_Angeles', 'America/Chicago', 'America/New_York', 'Europe/London', 'Europe/Istanbul', 'Australia/Brisbane',)
tzs
(#6) ['America/Los_Angeles','America/Chicago','America/New_York','Europe/London','Europe/Istanbul','Australia/Brisbane']
#| export
def time_in_tz(tz:str, dt:datetime|None=None) -> str: 
    if dt is None: dt = datetime.now()
    dt = dt.astimezone(ZoneInfo(tz))
    return f"{tz:20} {dt:%H:%M}"
tzs.map(time_in_tz).map(print)
(#6) [None,None,None,None,None,None]
#| export
def print_discord_time(dt:datetime|None=None) -> None:
    if dt is None: dt = datetime.now()
    print(f"{"Discord":20} <t:{int(dt.timestamp())}:f>")
print_discord_time()
#| export
def print_times(dt:datetime|None=None) -> None:
    if dt is None: dt = datetime.now()
    tzs = L('America/Los_Angeles', 'America/Chicago', 'America/New_York', 'Europe/London', 'Europe/Istanbul', 'Australia/Brisbane')
    tzs.map(time_in_tz).map(print)
    print_discord_time(dt)
print_times()

Make a TimeConverter FastTag

app, rt = fast_app(hdrs=(Theme.slate.headers(),))
def TimeConverter():
    return Form(
        H3("Convert a Time", cls="text-base font-semibold text-gray-900 dark:text-slate-100"),
        Input(name="dt", type="datetime-local", value="2025-02-03T14:30"),
        Button("Submit", cls=ButtonT.primary), hx_post="/convert", hx_target="#grid", hx_swap="outerHTML")

show(TimeConverter())

Convert a Time

dt = datetime.now()
dt
datetime.datetime(2025, 2, 3, 16, 8, 55, 368904)
def TimeTable(dt):
    tzs = L('America/Los_Angeles', 'America/Chicago', 'America/New_York', 'Europe/London', 'Europe/Istanbul', 'Australia/Brisbane',)
    return Table(
        Thead(Tr(Th(f"{dt:%a, %b %-d, %Y %H:%M} GMT is also", colspan=2))),
        *[Tr(
            Td(tz),
            Td(time_in_tz(tz, dt).split()[-1])
          ) for tz in tzs],
        Tr(Td("Discord"), Td(f"<t:{int(dt.timestamp())}:f>"))
    )
show(TimeTable(dt))
Mon, Feb 3, 2025 16:08 GMT is also
America/Los_Angeles 08:08
America/Chicago 10:08
America/New_York 11:08
Europe/London 16:08
Europe/Istanbul 19:08
Australia/Brisbane 02:08
Discord <t:1738598935:f>

Define Routes

@rt
def index():
    dt = datetime.now()
    return Grid(TimeTable(dt), TimeConverter(), id="grid")
@rt
def convert(dt:str):
    dt = datetime.fromisoformat(dt).replace(tzinfo=ZoneInfo('Europe/London'))
    return (TimeTable(dt), TimeConverter())
server = JupyUvi(app)
server.stop()

© 2024-2025 Audrey M. Roy Greenfeld