【问题标题】:How to get to values of given date in Swift?如何在 Swift 中获取给定日期的值?
【发布时间】:2017-05-29 14:47:48
【问题描述】:

我需要编写一个函数,得到这样的日期:"2017-04-20T12:12:17.004+0200"

我发现这个匹配模式:"yyyy-MM-dd'T'HH:mm:ss.SSSZ"

函数返回字符串:“现在是 2017 年 5 月 20 日星期一”。 为此,我必须获取每个值并验证它们。我不知道该怎么做。我知道有类似 components 的东西,但它只用于当前日期,没有给出。有人可以帮我吗? 这是我的代码:

var date = "2017-04-20T12:12:17.004+0200"

let dateFormatterGet = DateFormatter()
dateFormatterGet.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

    if let date = dateFormatterGet.date(from: date) as? Date {
        print(date)
    } else {
        // invalid format
        print("bad format")
    }

请帮忙:(

【问题讨论】:

  • 仅供参考 - 您不需要 if let 语句中的 as? Date
  • 获得(NS)Date 对象后,将dateFormat 更改为类似“EEEE dd', year' yyyy”,然后使用您的dateFormatter 将(NS)Date 转换为字符串:@987654327 @(或类似的东西。
  • @rmaddy 好的,我删除了它。
  • @Larme 嗯,这实际上不是我想要的
  • @Mark 似乎大多数人都认为你想要的。如果不是,请澄清您的问题,显示您想要的真实、实际结果。

标签: ios swift date time nsdate


【解决方案1】:

您可以使用组件,但这不是必需的,因为您可以使用 DateFormatter。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")

if let date = dateFormatter.date(from: date) {
    dateFormatter.dateFormat = "'It is' EEEE dd, MMMM, 'year' yyyy"
    // Just for this example we set it English
    // a better solution would be to use the devices local,
    // since this is what the user expecting how the date should be presented. 
    dateFormatter.locale = Locale(identifier: "en")
    let formatted = dateFormatter.string(from: date);

    print(formatted)
} else {
    // invalid format
    print("bad format")
}

我在 dateformatter 中添加了一个区域设置以确保格式为英文。

【讨论】:

  • 仅供参考 - 格式可能是:"'It is' EEEE dd, MMMM, 'year' yyyy"。你只需要引用字母,而不是任何标点符号。使其更易于阅读。
  • 另外,在尝试将 ISO8601/RFC3339 日期字符串转换为 Date 对象之前,您应该将格式化程序的 locale 设置为 Locale(identifier: "en_US_POSIX")。但是,在从 Date 对象创建最终字符串时,继续将其转换回 .current 或其他。
  • @Rob 这个日期字符串中可能存在哪些问题可以由en_US_POSIX 解决?由于那里没有本地化日期,还是我遗漏了什么?
  • @rckoenes - 原始日期字符串不是本地化日期字符串,这正是您必须使用en_US_POSIX 的原因。如果用户的日历不是公历,则无法保证可以正确解析公历 ISO8601 日期中的数值。此外,即使它没有阻塞,Date 对象也不会代表与原始日期字符串相同的日期。而且,仅供参考,我认为最终日期字符串应该本地化(例如,如果用户和设备使用的是非公历,如果它以公历格式显示日期,他们会认为这是一个错误)。
  • @rob 感谢您的解释,我很清楚您应该将设备本地化的问题。由于您永远不知道用户希望如何显示日期,但接下来会出现更多问题,例如应该是 Monday 20 还是 20 monday
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
相关资源
最近更新 更多