FastHTML and MonsterUI Time Converter
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)
America/Los_Angeles 07:49
America/Chicago 09:49
America/New_York 10:49
Europe/London 15:49
Europe/Istanbul 18:49
Australia/Brisbane 01:49
(#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()
Discord <t:1738597748:f>
#| 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()
America/Los_Angeles 07:49
America/Chicago 09:49
America/New_York 10:49
Europe/London 15:49
Europe/Istanbul 18:49
Australia/Brisbane 01:49
Discord <t:1738597748:f>
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
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()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[16], line 1
----> 1 server.stop()
NameError: name 'server' is not defined