将小时和分钟整数格式化为字符串“9:30 am”
Posted
技术标签:
【中文标题】将小时和分钟整数格式化为字符串“9:30 am”【英文标题】:Format hour and minute integers as the String "9:30 am" 【发布时间】:2021-06-22 15:22:35 【问题描述】:如何将小时和分钟整数值表示为格式为“9:30 am”的字符串?
目前,我有:
let hour: Int = 9
let minute: Int = 30
var dateComponents = DateComponents()
dateComponents.hour = hour
dateComponents.minute = minute
let time: String = DateComponentsFormatter.localizedString(from: dateComponents, unitsStyle: DateComponentsFormatter.UnitsStyle.positional)
print(time) // Prints "9:30", not "9:30 am"
我知道我可以在最后手动连接时间子午线,但我希望有一个内置功能。也许是不同的UnitsStyle
?
【问题讨论】:
DateComponentsFormatter
显示小时数而不是一天中的时间。 DateComponents
无论如何都是 24 小时制的。
@JoakimDanielson DateComponents 小时分量值范围是0-23
@JoakimDanielson 没有 am pm 组件
@Eric33187 世界各地的一些地方有夏令时转换。他们在夏天前后改变时钟以节省能源。所以有两个夏令时过渡日期。其中一个日期将少于 24 小时,另一个将有更多。因此,您可能会尝试设置一个不存在的时间,甚至是一个可能在同一天出现两次的时间。
哦,我明白了!所以换句话说,要设置时间,我应该总是使用日期,(这样时间是本地化的并且“正确”),而不是仅仅获取有时可能是错误的小时和分钟值。
【参考方案1】:
您可以使用DateFormatter
来实现此目的。
let formatter = DateFormatter()
formatter.dateFormat = "hh:mm a"
formatter.amSymbol = "am"
formatter.pmSymbol = "pm"
let dateString = formatter.string(from: Date())
print(dateString) // prints "12:17 pm"
如果您只想在小时中包含单个数字,那么您只需在 dateFormat 中包含一个“h”:
formatter.dateFormat = "h:mm a" // prints "1:30 pm" instead of "01:30 pm"
【讨论】:
你不应该选择用户应该如何显示他们的日期/时间。您应该使用日期格式化程序日期/时间样式并尊重用户设备区域设置和设置 这个答案与问题有什么关系? OP 希望格式化 2 个整数值而不是 Date 对象。 @JoakimDanielson True..... 我想我没有仔细看答案,看不出它需要Date
而不是Int
s。有人知道如何回答我的具体问题吗?【参考方案2】:
let formatter = DateFormatter()
formatter.dateFormat = "hh:mm a"
formatter.calendar = .current
let hour: Int = 9
let minute: Int = 30
var dateComponents = DateComponents()
dateComponents.hour = hour
dateComponents.minute = minute
If let fixedDate: Date = Calendar.current.date(from: dateComponents)
let formattedString = formatter.string(from: fixedDate)
print(formattedString) //prints 09:30 AM
您需要添加当前日历/日期,以便根据我所知道的时间从您的时间获取上午或下午。
编辑:
感谢 cmets 中的 Leo Dabus 指出这一点:上述方法将导致日期为 0001 年 1 月 1 日,如果日期对您很重要,您必须指定日期(日/月/年)
例如:
let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "hh:mm a"
formatter.calendar = .current
let hour: Int = 9
let minute: Int = 30
var dateComponents = DateComponents()
dateComponents.hour = hour
dateComponents.minute = minute
dateComponents.year = Calendar.current.component(.year, from: date)
dateComponents.month = Calendar.current.component(.month, from: date)
dateComponents.day = Calendar.current.component(.day, from: date)
If let fixedDate: Date = Calendar.current.date(from: dateComponents)
let formattedString = formatter.string(from: fixedDate)
print(formattedString)
【讨论】:
@Eric33187 不要在没有指定日期(日/月/年)的情况下这样做。上述方法将返回 0001 年 1 月 1 日的日期 @LeoDabus 感谢您指出这一点!我编辑了答案以包含这个! @shadowofarman 不要强制解包结果。如果日期不存在,这可能会使应用程序崩溃 @LeoDabus 也解决了这个问题,谢谢。我的假设是,既然我们刚刚创建了它,它肯定会存在。以上是关于将小时和分钟整数格式化为字符串“9:30 am”的主要内容,如果未能解决你的问题,请参考以下文章
以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)
在 Excel 中将时间格式化为天、小时、分钟和秒的更好方法?
在Python和openpyxl中使用小时和分钟-Excel格式与字符串和整数