在 .NET 中,_时间_这一概念通过 DateTime 结构体来处理。有一些例程可以在本地时间与 UTC 之间相互转换。借助 TimeSpan 还可以执行算术运算。
TimeZoneInfo 类提供了处理不同时区之间差异的例程。TimeZoneInfo 类还包含一些便于处理夏令时的方法。
CultureInfo 类支持依赖区域设置的日期时间格式。
为了支持跨平台编程,RuntimeInformation 类让你可以检测代码正在哪个操作系统上运行:Linux、Windows 或 OSX。
在这个练习中,你又回到了美容院的世界(最早出现在 datetimes 练习里)。和你的一些其他项目一样,你的又一位客户取得了巨大的成功,除了纽约总部之外,还在伦敦和巴黎开设了分店。
实现静态方法 Appointment.ShowLocalTime(),它接收一个 UTC 时间并把它作为本地时间返回。
// For a student in NY
Appointment.ShowLocalTime(new DateTime(2030, 7, 25, 13, 45, 0));
// => {2030, 7, 25, 8, 45, 0}
各家美容院负责接受自己的预约。输入的时间以该美容院所在的地点为准。例如,如果某人为纽约美容院的预约输入时间 13:45,他们会期望客户在午餐后不久就到店。同样,如果某人为伦敦美容院输入时间 13:45,他们也会期望客户在午餐后不久到达。
了解纽约、伦敦和巴黎的时区 id 会对你有所帮助。
在 Mac(OSX)和 Linux 上,它们是:
在 Windows 上,它们是:
实现静态重载方法 Appointment.Schedule(),它接收一个地点和时间的字符串,并返回该预约的 UTC 时间。
Schedule() 的实现需要让代码在构建之后能够在 Linux、Windows 和 Mac 上运行。这是第一个需要你考虑操作系统的练习。为了适应上文所述的时区 id 差异,必须使用不同的代码路径。
输入的日期时间字符串保证是有效的。
Appointment.Schedule("7/25/2030 13:45:00", Location.Paris);
// => {2030, 7, 25, 11, 45, 0}
实现静态方法 Appointment.GetAlertTime(),在预约前 1 天(提前)、1 小时 45 分钟(标准)和 30 分钟(延迟)提供提醒。
Appointment.GetAlertTime(new DateTime(2030, 7, 25, 14, 45, 0), AlertLevel.Early);
// => {2030, 7, 24, 14, 45, 0}
实现静态方法 Appointment.HasDaylightSavingChanged(),如果夏令时在过去 7 天内变为生效或失效,则返回 true。
Appointment.HasDaylightSavingChanged(new DateTime(2020, 3, 30, 14, 45, 0), Location.London);
// => true
为了让当地员工能够以他们熟悉的格式进行预约,你被要求编写一个实验性例程,允许按美容院所在位置的默认格式输入日期和时间。
实现 Appointment.NormalizeDateTime() 方法,它接收一个格式良好、符合当地格式的日期时间字符串,并将其转换为 DateTime 对象。不会尝试把该日期时间转换为 UTC。
如果输入的格式不正确,则应返回值为 1/1/1 的 DateTime。
Appointment.NormalizeDateTime("25/11/2019 13:45:00", Location.London);
// => {2019, 11, 25, 13, 45, 0}
Appointment.NormalizeDateTime("25/11/2019 13:45:00", Location.NewYork);
// => {1, 1, 1, 0, 0, 0}