日期和时间是编程的一个重要部分。它们帮助我们跟踪数据实例并允许我们按时间顺序组织数据集。
尽管它们很重要,但日期和时间的格式化和解释并不总是像人们所希望的那样简单明了。
例如,如果纽约市的日期是05/03/2022,时间是下午3:20,一般的纽约人会说现在是2022年5月3日下午3:20。然而,同样的日期和时间对伦敦的人来说却大不相同,他们会把这个日期解释为2022年3月5日,并说时间是18:20。
这些差异是由三个主要因素造成的:时区(东部标准时间与英国夏令时间);日期格式(月/日/年与日/月/年);以及时钟类型差异(美国使用12小时时钟,尽管伦敦可以使用两种时钟,但他们的政府文件通常使用24小时时钟)。
这些只是两个城市之间的一些日期和时间差异,但想象一下世界上所有国家的差异(甚至是国家内部的差异)。
这就是为什么如果你想让你的应用程序尽可能无障碍,你需要有逻辑来准确地以不同环境理解的格式表示日期和时间。
在这篇文章中,我将向你展示如何用Swift的 [DateFormatter](https://developer.apple.com/documentation/foundation/dateformatter)以及其他一些现有的库。首先,让我们开始使用DateFormatter 。
设置我们的环境
在我们开始之前,让我们先把自己设置好。创建一个新的Swift应用程序并在Xcode中打开它。
接下来,进入你的ContentView.swift 文件,在正文之外,实例化新的Date 和DateFormatter 对象。
let date = Date();
let dateFormatter = DateFormatter();
[Date](https://developer.apple.com/documentation/foundation/date)将给我们提供当前的日期和时间,与我们当前的时区有关。对我来说,现在是2022年6月1日,星期三。
dateFormatter 是一个 DateFormatter 类的实例,允许我们在我们的date 上操作各种格式化功能。这一点很重要,因为如果不首先对其进行适当的格式化,我们将无法在 Text视图中显示 。让我们看看我们如何在我们的ContentView 的 body中对其进行格式化。
var body: some View {
dateFormatter.dateStyle = .short
return Text(dateFormatter.string(from: date))
.padding()
}
上面的代码将缩写日期,并将其置于数字形式中。例如,我今天的日期(2022年6月1日)将变成6/1/22。
实施DateFormatter
要开始使用DateFormatter ,我们需要指定我们想要的样式。我们指定的.short 样式将date 以数字或缩短的格式呈现。这意味着月、日和年被表示为数字。还要注意的是,年份只有两个数字,而不是整整四个。
然后,.string 允许我们将date 转换为字符串类型(这也是我们的Text 视图所要求的)。它的样式是根据dateFormatter ,在我们的例子中是:short 。
如果我们想把日期的月份显示为缩写字符串,把日期显示为数字,把年份显示为完整的四位数,会怎么样呢?这就很简单了!我们可以用.我们将使用.medium ,而不是.short 。
如果我们想用完整的月名、数字的日和完整的年来显示日期呢?
你猜对了,我们会使用 .long 。
我们还可以进一步使用 .full,这样我们就可以得到星期几、完整的月份名称、一天的数字和完整的年份。你可以在下面看到它们。

应用timeStyle
如果你还想显示时间,你可以将timeStyle 应用到dateFormatter 。这个选项的应用与dateStyle 类似,你仍然可以使用内置的.short,.medium,.long, 和.full 格式。
你像这样分配timeStyle :
dateFormatter.timeStyle = .short
如果你在dateFormatter.dateStyle 后面加上上面这一行,它就会把缩短的时间加到你的日期上。你可以看到下面这个结果。

这个例子展示了dateStyle 作为.full ,timeStyle 作为.short 。
下面是其他的时间样式。

注意,上面显示的时间与前面的例子有点不同,因为我花了一些时间来改变timeStyle 。
使用dateFormat
除了设置dateStyle 和timeStyle ,我们还可以使用dateFormat 。我们将提供一个字符串,代表我们想要的日期和时间格式。
让我们实例化另一个名为dateFormatter2 的DateFormatter 实例。这一次,让我们使用 dateFormat ,而不是dateStyle 和timeStyle. 见下文。
dateFormatter2.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
…
Text(dateFormatter2.string(from: date))
.padding(.bottom)
现在让我们看看这在用户界面中的表现:

很完美!
设计日期的样式
为了清楚起见,让我们把dateFormat ,从日期开始。
年份(yyyy)是2022年。我们使用了完整的年份,但如果你想只显示 "22",你可以使用yy 。
月 (MM)是06,对应六月。如果你想显示不含0的月份,只需将其作为M 。如果你想把月份作为一个字符串,可以把MMMM 。
最后,日(dd)是01。如果你想显示没有0在前面的日子,只需把它作为D 。
时间的样式
要格式化小时,或HH ,你有两个选择。第一种是将时间格式化为HH ,这与24小时制的时间尺度一致。第二种选择是使用12小时制,要做到这一点,你只需要用H 。
mm 代表分钟, ss代表秒。这些都是相当不言自明的。
要改变这些数字的顺序,只需把它们放在字符串的不同部分。例如,"MM-dd-yyyy'T'h:mm:ss" 将看起来像06-01-2022T5:48:55 。
到目前为止还不错!我们现在可以使用DateFormatter ,用提供的格式或我们自己的字符串来格式化我们的日期和时间。
只有一个注意点。还记得我提到的关于不同的国家、城市、大陆等有不同的时区和日期风格吗?如果有一种方法,我们可以根据我们在世界的位置来格式化我们的日期...
...而好消息是,我们可以!这是由于本地化的缘故。这是可能的,因为有了本地化。
使用日期和时间格式化的本地化
本地化利用了locales,即用于定义用户的位置、语言和语法的参数集。如果你想让一个应用程序在全世界多个地方都能使用,这就很重要。
本地化超出了翻译的范围。虽然你可能能够使用语言API将英语的 "June 1 "翻译成荷兰语的 "juni 15",以便在荷兰使用,但从技术上讲,这仍然是不正确的本地化。
在荷兰,人们在阅读日期时将日期放在月份的前面。从技术上讲,"6月1日 "应该被本地化为 "1 juni"。
好消息是,DateFormatter 已经为我们处理了很多这方面的问题。然而,我们可以通过操纵locale 属性来手动更新我们的DateFormatter's locale。
这个属性决定了我们的格式化器的语言环境。如果我们不改变这个属性,所使用的locale将是美国英语(在Swift中用"en_us"表示)。
如果我们想使用荷兰作为我们的语言环境,我们可以这样设置这个值:
dateFormatter2.locale = Locale(identifier: "nl")
让我们看看我们的日期在新的语言环境下是什么样子的。

很完美!这样一来,我们不仅完成了语言的改变,而且还完成了地区性的格式化。这在整体上创造了一个更准确的日期。
总结
Swift中的日期格式化可以很简单,但我们有各种灵活和定制的选项。有些情况下可能需要一个更简短的日期,有些情况下可能需要一个更长的日期。
你可能也会发现,将月份显示为一个字符串比数字更容易让你的应用程序接受或凝聚在一起。你还可以通过实施本地化来更好地适应全球用户,使你的应用程序让他们感觉更熟悉。
时间是我们最宝贵的资产。我们至少可以做的是有效地格式化它。