如何在快速日期字符串中使用破折号(“-”)?

Posted

技术标签:

【中文标题】如何在快速日期字符串中使用破折号(“-”)?【英文标题】:How do I use dashes ("-") in a swift date string? 【发布时间】:2019-12-30 22:33:50 【问题描述】:

我希望将日期(2019 年 12 月 9 日星期一下午 4:22)显示为“星期一 - 2019 年 12 月 9 日下午 4:22”。

我试过了:

private func getLastUpdatedString(forTimestamp timestamp: Int) -> String 
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp/1000))
    let formatter = DateFormatter()
    formatter.locale = .current
    formatter.setLocalizedDateFormatFromTemplate("EEEE '-' MMMM d '-' yyyy',' h:mm a")

    return formatter.string(from: date)


print(getLastUpdatedString(forTimestamp: 1575926532472))
// prints: Monday, December 9, 2019, 4:22 PM

资源Unicode Technical Standard - PART 4: DATESDateFormatter - Apple

【问题讨论】:

您是否尝试过简单地设置formatter.dateFormat = "..." 而不是使用setLocalizedDateFormatFromTemplate h:mm a 不会真正适用于 .current 语言环境。系统设置可以将其覆盖为 24 小时制。 安德鲁,当用户指定了 24 小时制的首选项或指定月份的前一天时,您是否真的想在此显示日期格式,他们会觉得很陌生?一般来说,我们要尊重他们的喜好。或者您想以他们喜欢的格式向他们显示日期,只用破折号替换逗号? 感谢大家的帮助。 @Rob,这是一个好问题!这种格式是我的设计师的要求。但你是对的,它也应该本地化。有没有办法尊重每个用户的偏好,同时在所有语言环境中保留破折号? 【参考方案1】:

尝试设置dateFormat,而不是像这样使用setLocalizedDateFormatFromTemplate

formatter.dateFormat = "EEEE - MMMM d - yyyy, h:mm a"

【讨论】:

【参考方案2】:

您需要确定不同语言环境的各种格式。恕我直言,您不想要 "EEEE '-' MMMM d '-' yyyy',' h:mm a",因为在欧洲,他们使用 24 小时制,并且想要一个月的前一天。

我鼓励您在 UI 中尝试标准的日期/时间布局,例如:

let formatter = DateFormatter()
formatter.dateStyle = .full
formatter.timeStyle = .short

然后,美国用户会看到:

2019 年 12 月 31 日,星期二晚上 9:49

英国用户将看到:

2019 年 12 月 31 日星期二 21:49

您的法语用户会看到:

狂欢节 2019 年 12 月 31 日 à 21:49

但是,让我们假设一下,我无法说服您的设计师采用完善的惯例。那么,您将如何处理逗号的不一致使用和“at”介词的使用?也许

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full
dateFormatter.locale = Locale(identifier: "en_GB")

let timeFormatter = DateFormatter()
timeFormatter.timeStyle = .short
timeFormatter.locale = Locale(identifier: "en_GB")

let dateString = dateFormatter.string(from: date)
    .replacingOccurrences(of: ", ", with: " - ")

let timeString = timeFormatter.string(from: date)

let result = dateString + ", " + timeString

这是非标准的,但实现了设计者的目标,同时仍将解决方案本地化。

然后,美国用户会看到:

星期二 - 2019 年 12 月 31 日 - 晚上 9:49

英国用户将看到:

2019 年 12 月 31 日星期二 21:49

您的法语用户会看到:

狂欢节 2019 年 12 月 31 日,21:49

虽然我知道您的设计师无疑在寻找独特的东西,但我认为这只会有损用户界面。我会投票支持日期/时间字符串的既定约定。


顺便说一句,如果您决定构建自己的日期格式化字符串,我建议您使用j:mma 而不是h:mma。至少,您希望小时尊重用户对 12 v 24 小时制的偏好。例如,

dateFormatter.setLocalizedDateFormatFromTemplate("EEEEdMMMMyyyyj:mma")

【讨论】:

很好的答案抢!由于 DrewG20 解决了我的具体问题并且您帮助我实现了更通用的解决方案,您是否会将您的答案复制到一个新问题(“我如何在 localized 快速日期字符串中使用破折号 (“-”) ?”)我会在那里接受吗?这样,未来的用户可以从两个不同问题的正确答案中受益!【参考方案3】:

试试这个

 private func getLastUpdatedString(forTimestamp timestamp: Int) -> String 
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp/1000))
    let formatter = DateFormatter()
    formatter.dateFormat = "EEEE - MMMM d - yyyy, h:mm a"
    let result = formatter.string(from: date)
    return result


print(getLastUpdatedString(forTimestamp: 1575926532472))

【讨论】:

【参考方案4】:

遵循这两个论点: https://developer.apple.com/documentation/foundation/date https://developer.apple.com/documentation/foundation/dateformatter 第一个参数是教你如何创建日期。第二个参数是教你如何创建日期的格式。这两件事可能你是正确的。但在 macOS 10.12 及更高版本或 ios 10 及更高版本中存在主体。使用 ISO 8601 日期表示时,格式必须使用 ISO8601DateFormatter 类。那么你的格式正确与否?

【讨论】:

【参考方案5】:
private func getLastUpdatedString(forTimestamp timestamp: Int) -> String 
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp/1000))
    let formatter = DateFormatter()
    formatter.locale = .current
    formatter.dateFormat = "EEEE - MMMM d - yyyy, h:mm a"
    return formatter.string(from: date)

【讨论】:

【参考方案6】:

尝试使用dateFormat 设置您的更新代码,您可以使用如下:

private func getLastUpdatedString(forTimestamp timestamp: Int) -> String 
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp/1000))
    let formatter = DateFormatter()
    formatter.locale = .current
    formatter.dateFormat = "EEEE - MMMM d - yyyy, h:mm a"

    return formatter.string(from: date)


print(getLastUpdatedString(forTimestamp: 1575926532472))
// prints: Monday - December 9 - 2019, 4:22 PM

【讨论】:

以上是关于如何在快速日期字符串中使用破折号(“-”)?的主要内容,如果未能解决你的问题,请参考以下文章

删除 Pandas 中字符串列中的 Dash/Dots 并将其替换为 Null

如何从字符串创建 SEO 友好的破折号分隔 url?

如何替换除-(破折号)以外的特殊字符

如何解析/捕获由破折号分隔的字符串?

如何 grep 以破折号/连字符开头的字符串?

如何防止 LaTeX 连字符包含破折号的单词?