微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以使用DateComponentsFormatter呈现一天中的时间吗?

如何解决我可以使用DateComponentsFormatter呈现一天中的时间吗?

我想以一种简单的方式存储一天中的某个时间。就我的应用而言,我只关心一天中的某个特定时间,例如下午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是否支持我的用例?

解决方法

来自documentation

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

很显然,如果您恰好是夏令时或夏令时,您的结果可能会有所不同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。