轨道
/
Elm
Elm
/
练习
/
黑子的时钟
黑子的时钟

黑子的时钟

学习练习

简介

时间

使用Time模块来显示人类可读的日期/时间。 虽然从技术上讲,可以用Time来操作时间,但 Elm 社区有一些更适合这项任务的包,例如justinmimbs/date或CoderDennis/elm-time-format。

Posix

时间由不透明类型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。他还有一个额外的要求:这个应用要能用两种不同的语言显示时间:日语和美式英语。

1. 日期

定义一个函数 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日"

2. 时间到

定义一个函数 showLocalTime : Locale -> Int -> Int -> String,用来显示一个(有效的)本地时间。

在US区域中,小时会以 12 小时制显示,并附上“PM”或“AM”,分钟则会补前导零。

在JP区域中,小时会以 24 小时制显示在“時”之前,分钟则不补前导零,显示在“分”之前。

showLocalTime US 13 8
    -- "1:08 PM"
showLocalTime JP 13 8
    -- "13時8分"

3. 进入时区

定义一个函数 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分"
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Elm Exercism

准备好开始 黑子的时钟 了吗?

注册 Exercism,借助 28 个概念110 个练习 和真人导师指导,学习并掌握 Elm,全部免费。