F# 中的DateTime是一种不可变对象,既包含日期信息,也包含时间信息。要操作DateTime实例,需要调用它的方法。DateTime一旦创建,其值就再也不能改变。任何看似会修改DateTime的方法或函数,实际上都会返回一个新的DateTime。
日期和时间的文本表示形式取决于区域性。假设有一个DateTime,它的日期设为 2019 年 3 月 28 日,时间设为 14:30:59。在使用en-US区域性(美式英语)时,把这个DateTime转换成string会返回"3/28/19 2:30:59 PM"。而使用fr-BE区域性(比利时法语)时,同样的代码返回的值则不同:"28/03/19 14:30:59"。
了解哪些DateTime方法与区域性有关,这一点很重要。一般来说,任何涉及string(无论是输入还是输出)的DateTime方法,都会取决于当前区域性。
在这个练习中,你要为纽约一家美容院开发预约调度程序。这家美容院于 2012 年 9 月 15 日开业。
一共有四个任务,都会涉及预约日期。日期和时间会使用下面三种格式之一:
"7/25/2019 13:45:00""July 25, 2019 13:45:00""Thursday, July 25, 2019 13:45:00:00"测试会自动把区域文化设置为 en-US,你不需要自己设置或指定它。
实现 schedule 函数,它能把预约日期的文本表示解析成对应的 DateTime 格式:
schedule "7/25/2019 13:45:00"
// => DateTime(2019, 7, 25, 13, 45, 0)
实现 hasPassed 函数,它接收一个预约日期,检查这个预约是否在过去:
hasPassed (DateTime(1999, 12, 31, 9, 0, 0))
// => true
实现 isAfternoonAppointment 函数,它接收一个预约日期,检查这个预约是否在下午(大于等于 12:00 且小于 18:00):
isAfternoonAppointment (DateTime(2019, 03, 29, 15, 0, 0))
// => true
实现 description 函数,它接收一个预约日期,返回该日期和时间的描述:
description (DateTime(2019, 03, 29, 15, 0, 0))
// => "You have an appointment on 3/29/2019 3:00:00 PM."
实现 anniversaryDate 函数,它返回今年的周年纪念日,也就是 9 月 15 日:
anniversaryDate()
// => DateTime(2019, 9, 15, 0, 0, 0)