java iso 8601_如何在iOS上获得ISO 8601日期?
发布日期:2021-06-24 16:40:46 浏览次数:4 分类:技术文章

本文共 2057 字,大约阅读时间需要 6 分钟。

一个经常被忽视的问题是ISO 8601格式的字符串可能有毫秒而不是 .

换句话说,“2016-12-31T23:59:59.9999999”和“2016-12-01T00:00:00”都是合法的,但如果您使用的是静态类型的日期格式化程序,则其中一个将不会被解析 .

从 iOS 10 开始,您应该使用 ISO8601DateFormatter 来处理ISO 8601日期字符串的所有变体 . 见下面的例子:

let date = Date()

var string: String

let formatter = ISO8601DateFormatter()

string = formatter.string(from: date)

let GMT = TimeZone(abbreviation: "GMT")

let options: ISO8601DateFormatOptions = [.withInternetDateTime, .withDashSeparatorInDate, .withColonSeparatorInTime, .withTimeZone]

string = ISO8601DateFormatter.string(from: date, timeZone: GMT, formatOptions: options)

对于 iOS 9 and below ,请使用以下方法和多个数据格式化程序 .

我还没有找到一个涵盖这两个案例的答案,并且摘要了这个微妙的差异 . 以下是解决它的解决方案:

extension DateFormatter {

static let iso8601DateFormatter: DateFormatter = {

let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX")

let iso8601DateFormatter = DateFormatter()

iso8601DateFormatter.locale = enUSPOSIXLocale

iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

return iso8601DateFormatter

}()

static let iso8601WithoutMillisecondsDateFormatter: DateFormatter = {

let enUSPOSIXLocale = Locale(identifier: "en_US_POSIX")

let iso8601DateFormatter = DateFormatter()

iso8601DateFormatter.locale = enUSPOSIXLocale

iso8601DateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"

iso8601DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

return iso8601DateFormatter

}()

static func date(fromISO8601String string: String) -> Date? {

if let dateWithMilliseconds = iso8601DateFormatter.date(from: string) {

return dateWithMilliseconds

}

if let dateWithoutMilliseconds = iso8601WithoutMillisecondsDateFormatter.date(from: string) {

return dateWithoutMilliseconds

}

return nil

}

}

Usage:

let dateToString = "2016-12-31T23:59:59.9999999"

let dateTo = DateFormatter.date(fromISO8601String: dateToString)

// dateTo: 2016-12-31 23:59:59 +0000

let dateFromString = "2016-12-01T00:00:00"

let dateFrom = DateFormatter.date(fromISO8601String: dateFromString)

// dateFrom: 2016-12-01 00:00:00 +0000

我还建议检查Apple article关于日期格式化程序 .

转载地址:https://blog.csdn.net/weixin_33910305/article/details/114427946 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java 引用其他类_java如何调用其他类中的方法?
下一篇:power指令集 mysql_32位PowerPC常用指令集总结

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月21日 06时26分18秒