将小时和分钟整数格式化为字符串“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 而不是Ints。有人知道如何回答我的具体问题吗?【参考方案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”的主要内容,如果未能解决你的问题,请参考以下文章

将 timedelta 格式化为字符串

以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)

在 Excel 中将时间格式化为天、小时、分钟和秒的更好方法?

在Python和openpyxl中使用小时和分钟-Excel格式与字符串和整数

将秒格式化为 SQL 报表生成器 Y 轴标签的天、小时、分钟、秒

NSNumberFormatter 将浮点字符串格式化为整数