//go:build js package main import ( "log" "time" _ "time/tzdata" ) func main() { melTime, err := time.LoadLocation("Australia/Melbourne") if err != nil { log.Fatal(err) } sg, err := time.LoadLocation("Asia/Singapore") if err != nil { log.Fatal(err) } nyc, err := time.LoadLocation("America/New_York") if err != nil { log.Fatal(err) } la, err := time.LoadLocation("America/Los_Angeles") if err != nil { log.Fatal(err) } utc := time.UTC clocks := []clock{ { name: "UTC", loc: utc, elements: findClockElements("utc"), }, { name: "Australia/Melbourne", loc: melTime, elements: findClockElements("mel"), }, { name: "Asia/Singapore", loc: sg, elements: findClockElements("sg"), }, { name: "America/New_York", loc: nyc, elements: findClockElements("nyc"), }, { name: "America/Los_Angeles", loc: la, elements: findClockElements("la"), }, } updateClocks(clocks) go startClockUpdater(clocks) <-make(chan struct{}) } func startClockUpdater(clocks []clock) { for range time.Tick(1 * time.Second) { updateClocks(clocks) } } func updateClocks(clocks []clock) { n := time.Now() for _, c := range clocks { updateClock(n, c) } } func updateClock(t time.Time, clk clock) { lt := t.In(clk.loc) clk.elements.locationDiv.Set("innerText", clk.name) clk.elements.dateDiv.Set("innerText", lt.Format("02 Jan 2006")) clk.elements.timeDiv.Set("innerText", lt.Format("15:04:05")) }