微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决您可以使用Swift DateFormatter来获取Date对象,对其进行格式化并将其作为Date对象返回吗?

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

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

这真的是在Swift中重新格式化Date对象的“智能”方式吗?还是我错过了一些东西?

编辑:

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

解决方法

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

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,这表示不同的信息,具体取决于每个不同设备上的当前timeZone,日历等。如果将此信息存储在数据库中,则会导致很多基于时间的错误,因此,您应该不惜一切代价避免使用它。

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

,

像这样使用:

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。