您可以使用 Swift DateFormatter 获取 Date 对象,对其进行格式化,然后将其作为 Date 对象返回吗?

Posted

技术标签:

【中文标题】您可以使用 Swift DateFormatter 获取 Date 对象,对其进行格式化,然后将其作为 Date 对象返回吗?【英文标题】:Can you use a Swift DateFormatter to take a Date object, format it, and return it as a Date object? 【发布时间】:2020-12-23 14:52:29 【问题描述】:

我正在尝试使用 DateFormatter 在 Swift 中格式化 Date 对象。我正在从 UIDatePicker 中获取格式为 2020-09-04T10:19:26+0000 的 Date 对象,我想将其重新格式化为 2020-09-04 10:19。

据我了解,DateFormatter 只能使用 date(from: String) 方法从字符串创建 Date 对象,或者使用 string(from: Date) 从 Date 对象创建字符串。因此,对于我看似简单的用例,我需要两个 DateFormatter:一个用于将我的原始日期转换为字符串,另一个用于将该字符串格式化为我想要的格式并将其作为 Date 对象返回。

这真的是在 Swift 中重新格式化 Date 对象的“智能”方式,还是我遗漏了什么?

编辑:

我正在将项目(可能有截止日期)保存到数据库中。稍后,我计划根据截止日期从数据库中读取特定项目。 UIDatePicker 返回一个未格式化的 Date 对象(带有秒数、偏移量等),但我只需要日期、小时和分钟(精确到 15 分钟的间隔)。

【问题讨论】:

日期数据类型并不意味着要重新格式化,因为代表一个时间点,并且是通用的,所以Date对象总是格式化好,你需要使用一种或另一种日期格式,具体取决于什么格式您要显示的日期 Date 对象没有格式,它只是保存日期和时间的数据。将 DatePicker 中的 Date 对象保留为 Date ,直到需要在 UI 中显示它,然后使用格式化程序将其格式化为字符串 你打算如何使用这个“重新格式化的日期”?这将是一个很好的答案。 @RomanRyzhiy 在这种情况下重新格式化日期是没有意义的。为了向 OP 澄清,您在执行 print 或在调试器中查看日期对象时获得的格式只是使用默认格式格式化的日期。 @JoakimDanielson 我同意你的观点,但让我们得到 OP 的答案。 【参考方案1】:

您以错误的方式考虑日期。日期不是一种表示,而是一个固定的时间点,可以通过多种方式表示,具体取决于您如何编写日期以及您所在的时区。例如所有这些都可以代表完全相同的时间点:

YYYY (eg 2020)
YYYY-MM (eg 2020-07)
YYYY-MM-DD (eg 2020-07-16)
YYYY-MM-DDThh:mmTZD (eg 2020-07-16T19:20+01:00)
YYYY-MM-DDThh:mm:ssTZD (eg 2020-07-16T19:20:30+01:00)
YYYY-MM-DDThh:mm:ss.sTZD (eg 2020-07-16T19:20:30.45+01:00)

因此,如果您将Date 转换为String,然后再转换回Date,您通常会得到相同的对象。

您需要在此处注意,仅从字符串开始时,例如2020-07-16T19:20,这代表不同的信息,具体取决于每个不同设备上的当前时区、日历等。如果将此信息存储在数据库中,则会导致大量基于时间的错误,因此应不惜一切代价避免它。

从 datePicker 返回的 Date 对象是一个时间点,可以格式化为以您喜欢的任何格式显示该时间,因此将其用于表示目的,并将实际的 Date 对象存储在数据库中。

【讨论】:

YYYYyyyy 不同。 Y 是一年中的一年。 hh 表示 0-23 需要 1-12 小时,您需要使用 HH D 表示一年中的某一天而不是一个月中的某一天 dd s 是小数秒的秒数,您需要使用SS T 应该被转义,我不知道 TZD 是什么意思,但是对于 Z 代表 UTC 的时区,你应该使用 XXXXX【参考方案2】:

这样使用:

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

guard let inputTimeStamp = formatter.date(from: yourInputDate)?.timeIntervalSince1970 else  return 
let date = Date(timeIntervalSince1970: inputTimeStamp)
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let string = formatter.string(from: date)

【讨论】:

请再次阅读问题“并将其作为 Date 对象返回。” 这不是这里要问的。 @LeoDabus 我应该删除它吗?这不是他要找的。​​span>

以上是关于您可以使用 Swift DateFormatter 获取 Date 对象,对其进行格式化,然后将其作为 Date 对象返回吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 中的日期验证

在swift中使用DateFormatter时发生错误[重复]

Swift 5 - 无法解释的 DateFormatter 崩溃

在 Swift 中使用 DateFormatter 和 TimeZone 来格式化日期

在 Swift 3.1 中使用 DateFormatter 正确构建 dateFormat 以解析时间

DateFormatter 不转换特定日期 (Swift)