问题描述
我想以一种简单的方式存储一天中的某个时间。就我的应用而言,我只关心一天中的某个特定时间,例如下午2:30或上午1:10。
使用DateComponentsFormatter
,我可以很近了。
import Foundation
let formatter = DateComponentsFormatter()
formatter.unitsstyle = .positional
formatter.allowedUnits = [
.hour,.minute
]
// Use the configured formatter to generate the string.
let timeAmount = 9000.0
let outputString = formatter.string(from: timeAmount)
let desiredString = "2:30 pm"import Foundation
let formatter = DateComponentsFormatter()
formatter.unitsstyle = .positional
formatter.allowedUnits = [
.hour,.minute
]
// Use the configured formatter to generate the string.
let timeAmount = 9000.0
let outputString = formatter.string(from: timeAmount) // yields "2:30"
let desiredString = "2:30 pm"
现在,格式化程序似乎实际上只是在说“两小时三十分钟”,所以也许我在这里拨错了树。 DateComponentsFormatter
是否支持我的用例?
解决方法
DateComponentsFormatter
对象花费大量时间并将其格式化为用户可读的字符串。
要点是DateComponentsFormatter
会按时间量(例如2小时10分钟)运行,而您要及时 point 。这些是完全不同的东西。如果您尽力而为,尝试使用DateComponentsFormatter
来产生一天中的某个时间可能会奏效,只是您在滥用/滥用它。
似乎您将一天中的时间存储为自午夜以来的秒数。要使用DateComponentsFormatter
进行格式化,您需要对存储的号码进行大量检查和计算:
- 您需要自己添加am / pm字符串。
- 您需要在不到1小时的任何时间增加12小时。
- 如果存储时间大于12小时,则需要减去12小时。
- 您可能还需要考虑我错过的事情
此外,am / pm不可本地化。世界上可能还存在一些文化,它们使用不同的格式来显示一天中不同时间的时间(我不知道!),这将导致这种方法彻底崩溃。
DateFormatter
应该用于格式化一天中的时间。只需将存储的时间添加到UNIX纪元时间(或任何其他午夜),并使用UTC时区进行格式化:
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "hh:mm a"
// or you can replace the above 2 lines with something more localised:
// formatter.timeStyle = .short
formatter.timeZone = TimeZone(identifier: "UTC")
let output = formatter.string(from: Date(timeIntervalSince1970: storedTime))
,
DateComponentsFormatter
用于表示两个日期之间的时间量。 DateFormatter
用于格式化日期或时间。使用DateFormatter
。
如果您要在用户界面中显示时间,请使用DateFormatter
,但是
- 请勿使用
dateFormat
,而应使用timeStyle
; - 请勿覆盖
locale
; - 请勿设置
timeZone
;
例如在用户界面中显示当前时间:
let date = Date()
let formatter = DateFormatter()
formatter.timeStyle = .short
let string = formatter.string(from: date)
顺便说一句,这将格式化用户喜欢的时间字符串(例如,对于我们中的某些人来说是AM / PM,但在其他语言环境中,用户可能更喜欢24小时制)。在用户界面中显示信息时,我们应始终遵守用户的偏好设置。
如果您要将9,000秒转换为凌晨2:30:
let startOfDay = Calendar.current.startOfDay(for: Date())
let date = startOfDay.addingTimeInterval(9000)
let formatter = DateFormatter()
formatter.timeStyle = .short
let string = formatter.string(from: date) // 2:30 AM
很显然,如果您恰好是夏令时或夏令时,您的结果可能会有所不同。