from datetime import datetime from fastcore.utils import * from fasthtml.common import * from fasthtml.jupyter import * from monsterui.all import * from zoneinfo import ZoneInfo
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.
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
#| 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)
#| 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())
dt = datetime.now() dt
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