如何将 toIso8601String 转换为 Swift 日期

Posted

技术标签:

【中文标题】如何将 toIso8601String 转换为 Swift 日期【英文标题】:How to convert toIso8601String to Swift Date 【发布时间】:2021-09-18 14:11:09 【问题描述】:

我正在尝试在 ios 中为一个小部件搭建 Flutter 和 swift 之间的桥梁。我面临的问题是将 DateTime.now().toIso8601String 转换为 Swift 中可用的日期对象,这就是我的代码的样子:

        let shared = sharedDefaults?.object(forKey: "widgetData") as? [String: String] ?? [String: String]()
        
            let isoDateFormatter = ISO8601DateFormatter()
            isoDateFormatter.timeZone = TimeZone(abbreviation: "GMT")
            isoDateFormatter.formatOptions = [.withInternetDateTime,
                                              .withDashSeparatorInDate,
                                              .withFullDate,
                                              .withFractionalSeconds,
                                              .withColonSeparatorInTime]
            let realDate = isoDateFormatter.date(from: shared["start"]!)
            print(realDate)
            print(shared["start"]!)
          flutterData = FlutterData(title: shared["title"]!,
                                        comment: shared["comment"]!,
                                        end: nil,
                                        start: realDate ?? Date())

我已经内置了对当前 Date() 的回退,但我似乎无法将 DateTime 字符串转换为快速的 Date 对象

这是打印后的样子:

2021-09-18T14:56:50.606258

【问题讨论】:

我认为是小数位数的问题,尝试使用格式为“yyyy-MM-dd'T'HH:mm:ss.SSSSSS”的普通 DateFormatter 感谢为我工作: 【参考方案1】:

它似乎适用于以下选项

Be cautious 关于withFractionalSeconds 选项

macOS 10.13/iOS 11 之前的 ISO8601DateFormatter 不支持 日期字符串,包括毫秒。

let isoDateFormatter = ISO8601DateFormatter()
isoDateFormatter.timeZone = TimeZone(abbreviation: "GMT")
isoDateFormatter.formatOptions = [.withDashSeparatorInDate,
                                  .withFullDate,
                                  .withTime,
                                  .withFractionalSeconds,
                                  .withColonSeparatorInTime]

let dateString = "2021-09-18T14:56:50.606258"
let realDate = isoDateFormatter.date(from: dateString)
print(realDate) // prints w/o fractional seconds
let calendar = Calendar.autoupdatingCurrent
let comps = calendar.dateComponents([.nanosecond], from: realDate!)
print(comps) // print nanoseconds part

【讨论】:

withFractionalSeconds 仅适用于 11.2.1 或更高版本【参考方案2】:

感谢 Joachim Danielson 的评论,这对我有用:

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"
        let realDate = dateFormatter.date(from: shared["start"]!)

【讨论】:

您的代码可能会失败,因为用户设备的 24 小时设置已关闭。另请注意,日期字符串时区为 UTC,它将使用当前时区解析日期。因此,您应该在设置 dateFormat 之前将 dateFormatter 语言环境设置为“en_US_POSIX”。如果您的日期字符串是 UTC,请不要忘记设置时区

以上是关于如何将 toIso8601String 转换为 Swift 日期的主要内容,如果未能解决你的问题,请参考以下文章

Swift:将 ISO8601 转换为日期

如何将 ISO8601 格式转换为毫秒?

如何使用 Shell 将 ISO 8601 时间戳转换为 Unix 时间戳?

如何将 Excel 中的日期转换为 ISO 8601 格式

如何将 ISO8601 TimeSpan 转换为 C# TimeSpan?

如何配置 web api 的 json 序列化器将日期时间转换为 ISO 8601 格式?