如何在快速日期字符串中使用破折号(“-”)?
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
【讨论】:
以上是关于如何在快速日期字符串中使用破折号(“-”)?的主要内容,如果未能解决你的问题,请参考以下文章