在 Swift 中使用 DateFormatter 的教程
日期和时间是编程的一个重要部分。它们帮助我们跟踪数据实例并允许我们按时间顺序组织数据集。
尽管它们很重要,但日期和时间的格式化和解释并不总是像人们所希望的那样简单明了。
例如,如果纽约市的日期是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中的日期格式化可以很简单,但我们有各种灵活和定制的选项。有些情况下可能需要一个更简短的日期,有些情况下可能需要一个更长的日期。
你可能也会发现,将月份显示为一个字符串比数字更容易让你的应用程序接受或凝聚在一起。你还可以通过实施本地化来更好地适应全球用户,使你的应用程序让他们感觉更熟悉。
时间是我们最宝贵的资产。我们至少可以做的是有效地格式化它。
推荐阅读
-
在 Swift 中使用 DateFormatter 的教程
-
任天堂 Switch 注册账号教程--Switch 的游戏是不锁区的,也就是说美国买的游戏可以用日本账号打开玩,游戏内容是一样的,没有区别。(有些游戏比较特殊,比如《Splatoon 2》,日版只有日文版,美版只有英文版)。 正如我之前所说,日版游戏和美版游戏虽然不同,但就我所见,大部分游戏都是可以买到的,只是可能发售时间不同,语言补丁更新的快慢不同,价格也略有不同。 最后,填写表格并勾选同意使用条款,然后确定以获取 5 位数的验证码。 获取注册码 在刚才看到的 Switch 屏幕上输入五位数的启动代码。 帐户登录完成 欢迎光临。 请将本文加入书签,并随时转发给您的新朋友!
-
在 keil (mdk) 中,在编译时删除未使用的函数,以减少代码量。
-
在格式工厂中使用剪辑音频的简单教程分享
-
位、字节、WORD、DWORD 的区别和联系 - Unicode 和 ANSI 的区别就像输入法中 "全宽 "和 "半宽 "的区别一样。 由于不同的 ANSI 编码有不同的标准(不同的字符集),对于给定的多字节字符串,我们必须知道它使用的是哪种字符集,才能知道它包含哪些 "字符"。对于 UNICODE 字符串来说,无论环境如何,它所代表的 "字符 "内容始终是相同的。Unicode 有一个统一的标准,定义了世界上大多数字符的编码,因此拉丁文、数字、简体中文、繁体中文和日文都可以存储在一个编码中。统一码是一个统一的标准,定义了世界上大多数字符的编码。 比特(Bit)和字节(Byte)的区别:例如USB2.0 标准接口的传输速率为 480Mbps,有一些人误认为是每秒 480 兆比特,同样网络带宽为 2MB,就容易误认为是每秒 2 兆比特。其实,480Mbps 应该是 480 兆比特/秒或 480 兆字节/秒,它等于 "60 兆字节/秒";同样,2MB,应该是 256 兆字节/秒。 Bit 和 Byte 译为 "比特",都是数据计量单位,比特="位 "或 "比特"。 Byte = 字节,即 1byte = 8bits,两者的换算关系为 1:8。 Mbps = mega bits per second(兆位/秒)是速率单位,因此 2M 带宽应为 2 兆位/秒,即 2MBps。MB = 兆字节(Megabytes,兆字节)是单位量,1MB/S(兆字节/秒)= 8MBPS(兆字节/秒)。 通常所说的硬盘容量是指 40GB、80GB、100GB,其中的 B 是指 Byte 也称为 "字节"。 1 KB=1024 字节 1 MB=1024 KB=1024*1024 字节 1 GB=1024 MB=1024*1024*1024 字节 例如,以前所谓的 56KB MODEM 转换过来的 56KBps 除以 8 就是 7Kbyte,所以真正从网上下载文件存在硬盘上的速度也是每秒 7Kbyte;也就是说,用 B 表示传输速度一般指 Bit;用 B 表示容量一般指 Byte。比特、字节、WORD、DWORD 的本质。
-
贪婪算法在 Python、JavaScript、Java、C++ 和 C# 中的多种实现及其在硬币变化、分数骑士、活动选择和使用哈夫曼编码的最小生成树问题中的应用实例
-
问 在连体架构中,梯度如何飞回网络?即使使用不同的模型,所有 CNN 模型的权重也是相同的。
-
在 win 环境下使用 cv2.imshow 报告 Python 中的 OpenCV 错误解决方案-1.
-
使用 `react-google-login` 在 React 应用程序中添加 Google 登录的指南
-
微信 "扫一扫 "物联网,全面揭秘 "扫一扫 "背后的扫盲技术!-1.1 扫一扫感知物体是做什么的? 1.1 微信扫一扫是做什么的? 扫一扫识物是指以图片或视频(商品图片:鞋/包/美妆/服饰/家电/玩具/图书/食品/珠宝/家具/其他商品)为输入媒介,挖掘微信内容生态中的有价值信息(电商+百科+资讯,如图1所示),并展示给用户。这里的电商基本涵盖了微信小程序覆盖上亿SKU的全量优质电商,可以支持用户货比N家并直接下单购买,百科和资讯则聚合了微信内的头部自媒体如搜狗、搜搜、百度等,向用户展示和分享拍摄商品相关的内容资讯。 图 1 扫一扫识别功能示意图 欢迎大家更新iOS新版微信→扫一扫→识货,亲自体验,也欢迎大家通过识货界面的反馈按钮向我们提交反馈意见。 扫一扫识物实景图展示 1.2 扫一扫识物有哪些使用场景? 扫一扫识物的目的是为用户访问微信内部生态内容开辟一个新窗口,以用户扫图片为输入形式,为用户提供微信生态内容中的百科、资讯、电商等作为展示页面。除了用户熟悉的扫一扫操作外,我们还将进一步拓展长按操作,让用户更方便地进行扫一扫操作。"扫一扫知事 "的落地场景主要涵盖三大部分: a. 科普知识: a.科普知识。用户通过扫一扫,可以在微信生态圈中获取该对象的百科、资讯等常识或趣闻,帮助用户更好地了解该对象; b.购物场景。同样的搜索功能支持用户看到喜欢的商品立即检索到微信小程序电商中的同款商品,支持用户即扫即购; c.广告场景。扫一扫识别物体可以辅助公众号文章、视频更好地理解其中蕴含的图片信息,从而更好地投放匹配广告,提高点击率。 1.3 Sweep Sense 为 Sweep 家族带来了哪些新技术? 对于扫一扫来说,大家耳熟能详的应该就是扫一扫二维码、扫一扫小程序码、扫一扫条形码、扫一扫翻译了。无论是各种形式的编码还是文字字符,都可以看作是图片的一种特定编码形式,而物的识别则是对自然场景图片的识别,这对于扫一扫家族来说是一个质的飞跃,我们希望从物的识别入手,进一步拓展扫一扫对自然场景图片的理解能力,比如扫酒、扫车、扫植物、扫人脸等服务,如下图3所示。 图 3 Sweep 家族