swift – 如何配置DateFormatter以捕获微秒
发布时间:2020-12-14 05:03:48 所属栏目:百科 来源:网络整理
导读:iOS Date()以至少微秒的精度返回日期. 我通过调用Date().timeIntervalSince1970检查了这个语句,结果是1490891661.074981 然后我需要将日期转换为具有微秒精度的字符串. 我以下列方式使用DateFormatter: let formatter = DateFormatter()formatter.dateForma
iOS Date()以至少微秒的精度返回日期.
我通过调用Date().timeIntervalSince1970检查了这个语句,结果是1490891661.074981 然后我需要将日期转换为具有微秒精度的字符串. let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ" print(formatter.string(from: date)) 结果 现在,如果我们比较两个结果: 有没有人知道如何配置DateFormatter所以我可以保持微秒并得到正确的结果:“2017-03-30T16:34:21.074981Z”? 解决方法
感谢@MartinR解决了我的问题的前半部分,感谢@ForestKunecke为我提供了如何解决问题后半部分的提示.
基于他们的帮助,我创建了可立即使用的解决方案,该解决方案从字符串转换日期,反之亦然,精确到毫秒: public final class MicrosecondPrecisionDateFormatter: DateFormatter { private let microsecondsPrefix = "." override public init() { super.init() locale = Locale(identifier: "en_US_POSIX") timeZone = TimeZone(secondsFromGMT: 0) } required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override public func string(from date: Date) -> String { dateFormat = "yyyy-MM-dd'T'HH:mm:ss" let components = calendar.dateComponents(Set([Calendar.Component.nanosecond]),from: date) let nanosecondsInMicrosecond = Double(1000) let microseconds = lrint(Double(components.nanosecond!) / nanosecondsInMicrosecond) // Subtract nanoseconds from date to ensure string(from: Date) doesn't attempt faulty rounding. let updatedDate = calendar.date(byAdding: .nanosecond,value: -(components.nanosecond!),to: date)! let dateTimeString = super.string(from: updatedDate) let string = String(format: "%@.%06ldZ",dateTimeString,microseconds) return string } override public func date(from string: String) -> Date? { dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" guard let microsecondsPrefixRange = string.range(of: microsecondsPrefix) else { return nil } let microsecondsWithTimeZoneString = String(string.suffix(from: microsecondsPrefixRange.upperBound)) let nonDigitsCharacterSet = CharacterSet.decimalDigits.inverted guard let timeZoneRangePrefixRange = microsecondsWithTimeZoneString.rangeOfCharacter(from: nonDigitsCharacterSet) else { return nil } let microsecondsString = String(microsecondsWithTimeZoneString.prefix(upTo: timeZoneRangePrefixRange.lowerBound)) guard let microsecondsCount = Double(microsecondsString) else { return nil } let dateStringExludingMicroseconds = string .replacingOccurrences(of: microsecondsString,with: "") .replacingOccurrences(of: microsecondsPrefix,with: "") guard let date = super.date(from: dateStringExludingMicroseconds) else { return nil } let microsecondsInSecond = Double(1000000) let dateWithMicroseconds = date + microsecondsCount / microsecondsInSecond return dateWithMicroseconds } } 用法: let formatter = MicrosecondPrecisionDateFormatter() let date = Date(timeIntervalSince1970: 1490891661.074981) let formattedString = formatter.string(from: date) // 2017-03-30T16:34:21.074981Z (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |