【问题标题】:How to convert date using dateformatter for "YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]"?如何使用日期格式化程序为“YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]”转换日期?
【发布时间】:2021-02-02 09:23:47
【问题描述】:

我从服务器获取的日期是这种格式"2020-11-28T19:24:58.478641+05:30" 但我无法使用日期格式化程序将其转换为日期。

  let input = "2020-11-28T19:24:58.478641+05:30"
  let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateStyle = .full
    formatter.setLocalizedDateFormatFromTemplate("YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]")
    formatter.timeStyle = .full
    
    let date = formatter.date(from: input)
    print(date) 

print(date) 在任何情况下都返回 nil。我尝试在线转换这个在https://nsdateformatter.com/成功的@

IMG ->converted date on nsdateformatter.com

如何使服务器日期适应 iOS 现有的日期格式?

【问题讨论】:

  • 需要哪种甲酸盐输出?
  • 如果您使用日期格式,请停止使用 timeStyledateStyle,否则会破坏输出。想要一点小费吗?您的格式化程序所期望的字符串是:print(formatter.string(date: Date()),您会看到。还有YYYYDD 等,它区分大小写,我不认为你想要它们大写。这不是正则表达式,也不是 [+HH:MM|-HH:MM|Z],这里不是小时,而是时区。
  • formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ" 应该是诀窍。
  • 是的,改成这种格式就可以了,非常感谢@Larme!

标签: ios swift date nsdateformatter dateformatter


【解决方案1】:

你试过ISO8601DateFormatter吗?

let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let date = formatter.date(from: input)

【讨论】:

    【解决方案2】:

    试试这个:

    let dateString = "2020-11-28T19:24:58.478641+05:30"
    let formatter = DateFormatter()
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSz"
    let date = formatter.date(from: dateString)
    date // Nov 28, 2020 at 5:24 AM
    

    【讨论】:

    • 您可以为小数秒添加一个 S 足以解析最多 3 个小数位数。 DateFormatter 将始终丢弃第三个数字之后的任何小数位。另请注意,如果 OP 使用相同的格式从生成的日期生成字符串,则使用 GMT+/-x 而不是 +XX:XX。取决于设备的当前时区。所以最好将日期格式化程序的时区设置为 UTC 并将其 dateFormat 更改为 "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
    • 谢谢,我不知道这些点@LeoDabus
    • @LeoDabus 这真的很有帮助,我想我直到现在才找到合适的格式。
    • @rebel_codeaz 你不能同时使用 dateFormat 和 dateStyle。删除日期上方的最后 3 行代码(来自:输入)
    • 是的,明白了。另外要转换为我的本地时间,我还需要将时区指定为 TimeZone(abbreviation: "GMT")
    猜你喜欢
    • 2013-06-18
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多