当前位置: 首页 > 知识库问答 >
问题:

我如何在SWIFT中解析/创建以小数秒UTC时区(ISO 8601,RFC 3339)格式化的日期时间戳?

孙项禹
2023-03-14

如何使用ISO 8601和RFC 3339的格式标准生成日期时间戳?

目标是一个看起来像这样的字符串:

"2015-01-01T00:00:00.000Z"

格式

  • 年、月、日,作为“xxxx-xx-xx”
  • 字母“T”作为分隔符
  • 时、分、秒、毫秒,以“xx:xx:xx.xxx”表示。
  • 字母“Z”作为零偏移量的区域指示符,也称为“Z”。UTC、GMT、Zulu时间。

最佳情况:

    null

相关问答:如何在iOS中获取ISO 8601日期?

以下是我目前想出的最好的方法:

var now = NSDate()
var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
println(formatter.stringFromDate(now))

共有1个答案

子车芷阳
2023-03-14

Swift 4•iOS 11.2.1或更高版本

extension ISO8601DateFormatter {
    convenience init(_ formatOptions: Options) {
        self.init()
        self.formatOptions = formatOptions
    }
}
extension Formatter {
    static let iso8601withFractionalSeconds = ISO8601DateFormatter([.withInternetDateTime, .withFractionalSeconds])
}
extension Date {
    var iso8601withFractionalSeconds: String { return Formatter.iso8601withFractionalSeconds.string(from: self) }
}
extension String {
    var iso8601withFractionalSeconds: Date? { return Formatter.iso8601withFractionalSeconds.date(from: self) }
}

用法:

Date().description(with: .current)  //  Tuesday, February 5, 2019 at 10:35:01 PM Brasilia Summer Time"
let dateString = Date().iso8601withFractionalSeconds   //  "2019-02-06T00:35:01.746Z"

if let date = dateString.iso8601withFractionalSeconds {
    date.description(with: .current) // "Tuesday, February 5, 2019 at 10:35:01 PM Brasilia Summer Time"
    print(date.iso8601withFractionalSeconds)           //  "2019-02-06T00:35:01.746Z\n"
}

iOS 9•Swift 3或更高版本

extension Formatter {
    static let iso8601withFractionalSeconds: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
        return formatter
    }()
}
extension JSONDecoder.DateDecodingStrategy {
    static let iso8601withFractionalSeconds = custom {
        let container = try $0.singleValueContainer()
        let string = try container.decode(String.self)
        guard let date = Formatter.iso8601withFractionalSeconds.date(from: string) else {
            throw DecodingError.dataCorruptedError(in: container,
                  debugDescription: "Invalid date: " + string)
        }
        return date
    }
}
extension JSONEncoder.DateEncodingStrategy {
    static let iso8601withFractionalSeconds = custom {
        var container = $1.singleValueContainer()
        try container.encode(Formatter.iso8601withFractionalSeconds.string(from: $0))
    }
}
let dates = [Date()]   // ["Feb 8, 2019 at 9:48 PM"]
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601withFractionalSeconds
let data = try! encoder.encode(dates)
print(String(data: data, encoding: .utf8)!)

解码

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601withFractionalSeconds
let decodedDates = try! decoder.decode([Date].self, from: data)  // ["Feb 8, 2019 at 9:48 PM"]
 类似资料:
  • 目标:找到和,然后以以下格式构造URL。 示例URL:/actions/sleep?duration=2002-10-10t12:00:00−05:00 格式基于W3C建议:http://www.w3.org/tr/xmlschema11-2/#datetime 文件中说: 例如,2002-10-10T12:00:00-05:00(2002年10月10日中午,中央夏令时和美国东部标准时间)等于20

  • 问题内容: 我正在尝试对JavaScript应用程序中的日期进行序列化/反序列化。 服务器端,我使用Java,JodaTime已安装在上面。我发现了如何使用UTC时区序列化为ISO,但是找不到如何进行反向操作。 这是我的代码 我不在乎是否使用Joda,只需要一个快速且有效的解决方案, 问题答案: 如果您使用的是Java 7或更早版本,则可以参考此文章。 如果您使用的是Java 8,则可以执行以下操

  • 我有一个方法可以生成一个随机的日期和时间。 打印输出类似于 我见过几个这样的问题和页面,但他们没有给我一个线索。

  • 问题内容: 我正在使用bootstrap-datetimepicker和ISO8601 datetime格式,如其选项部分所述 在我的控制器中 它以(console.log)将数据发送到后端 并保存为数据库 在我的模板中 我在HTML上看到的输出为 但是根据Angular doc,它应该用于格式 我想念的是什么? 问题答案: 现在,我已经创建了一个过滤器 作为依赖项添加为 并用作 并将日期显示为

  • 问题内容: 我可以通过java.util.Date(milliseconds)在Java中创建类似的Date对象。如何在Python中创建可比对象? 分配一个Date对象,并将其初始化为表示自标准基准时间(即“纪元”)(即GMT 1970年1月1日)以来指定的毫秒数。 问题答案: 只需将其转换为时间戳

  • 我正在尝试使用Jackson将ISO8601格式的日期反序列化为Java8。我向ObjectMapper注册了JavaTimeModule,并关闭了设置。 但是,如果试图反序列化将不起作用,因为JavaTimeModule似乎只会反序列化使用UTC时区偏移量格式化的日期时间(例如)。然后我尝试使用注释,如下所示: 就像这样: 然而,这两种方法都不起作用,我得到了一个例外: 这意味着timezone