使用Time模块来显示人类可读的日期/时间。
虽然从技术上讲,可以用Time来操作时间,但 Elm 社区有一些更适合这项任务的包,例如justinmimbs/date或CoderDennis/elm-time-format。
时间由不透明类型Posix表示,它包装了 Unix 纪元时间,即自 1970 年 1 月 1 日午夜 UTC 以来经过的毫秒数。
Posix是一个无歧义的值,不会因时区而变化,因此很适合用来记录时间。
在 Elm 应用程序中,Posix时间通常由外部来源(例如浏览器)提供。
可以用以下函数将Posix转换为毫秒数,反之亦然:
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
在日常生活中,我们人类通常不直接读取Posix,而是更喜欢本地时间,本地时间取决于我们在地球上的位置以及当地的夏令时规则。
在 Elm 中,这类信息编码在不透明类型Zone中,通常由浏览器提供。
有一个始终可访问的特殊Zone:
utc : Zone
有了Posix和Zone,我们就有足够的信息来以任意详细程度显示本地时间。
以下是可用于此目的的函数列表:
toYear : Zone -> Posix -> Int
toMonth : Zone -> Posix -> Month
toDay : Zone -> Posix -> Int
toWeekday : Zone -> Posix -> Weekday
toHour : Zone -> Posix -> Int
toMinute : Zone -> Posix -> Int
toSecond : Zone -> Posix -> Int
toMillis : Zone -> Posix -> Int
你可能已经注意到Time中还有两个自定义类型:
type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
将这些自定义类型转换为人类可读的值,就留给用户了。
你的日本朋友 Kuroko 是一位面向国际观众的主播。Kuroko 的直播日程相当复杂,每天的直播似乎都在不同的时间开始。
他请你帮忙做一个小应用,用观众所在的本地时区来显示他的日程:Kuroko's Clock。他还有一个额外的要求:这个应用要能用两种不同的语言显示时间:日语和美式英语。
定义一个函数 showLocalDate : Locale -> Int -> Month -> Int -> String,用来显示一个(有效的)本地日期。
在US区域中,格式为Month/Day/Year,不补前导零。
在JP区域中,格式为Year年Month月Day日,同样不补前导零。
showLocalDate US 2025 May 1
-- "5/1/2025"
showLocalDate JP 2025 May 1
-- "2025年5月1日"
定义一个函数 showLocalTime : Locale -> Int -> Int -> String,用来显示一个(有效的)本地时间。
在US区域中,小时会以 12 小时制显示,并附上“PM”或“AM”,分钟则会补前导零。
在JP区域中,小时会以 24 小时制显示在“時”之前,分钟则不补前导零,显示在“分”之前。
showLocalTime US 13 8
-- "1:08 PM"
showLocalTime JP 13 8
-- "13時8分"
定义一个函数 showDateTime : Locale -> Zone -> Posix -> String,用来按照特定的区域,显示相对于某个时区的日期和时间。
使用showLocalDate和showLocalTime来显示最终结果。
showDateTime US Time.utc (Time.millisToPosix 0)
-- "1/1/1970 12:00 AM"
showDateTime JP Time.utc (Time.millisToPosix 0)
-- "1970年1月1日0時0分"