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

获取月初和月底以及 12 月的时间

如何解决获取月初和月底以及 12 月的时间

正如标题所示,我正在尝试使用 12 月的时间组件来获取月的开始和结束时间。我确定我遗漏了一些与 TimeZones 明显相关的内容,但我似乎无法在 PST 时区的两个日期中获得相同的年份。

这是我如何获得月份和日期的开始:

注意:如果您在 swift REPL 中尝试此操作,则会有一个错误显示 nil 结果,即使 变量具有非 nil 值,请使用 printdebugPrint显示该值。

let cal = Calendar.current
let startOfMonth = cal.startOfDay(for: cal.date(from: DateComponents(year: 2020,month: 12,day: 1))!)

以下是我计算一天结束时间的方法

let startOfNextMonth = cal.date(byAdding: DateComponents(month: 1),to: startOfMonth)!
let endOfMonth = cal.date(byAdding: DateComponents(second: -1),to: startOfNextMonth)!

此时 startOfMonth 的值为:Optional(2020-12-01 08:00:00 +0000)endOfMonth 的值为 Optional(2021-01-01 07:59:59 +0000)

这看起来很好很花哨,因为时间是以格林威治标准时间 (UTC) 打印的,如果我减去 8 小时 endOfMonth,它最终会像 Optional(2020-12-31 23:59:59 +0000)

然而,在格式化 endOfMonth 日期时会出现问题,即使我将 TimeZone 设置为 "America/Los_Angeles",我仍然将年份值设为 2021 而不是 2020,这是我创建格式化程序的方法

let fmt = DateFormatter()
fmt.timeZone = .current // "America/Los_Angeles"
fmt.dateFormat = "d/Y"

fmt.string(from: endOfMonth!) // $R13: String = "31/2021"

这是怎么回事?转换到认时区不会产生 2020 年吗?

解决方法

将格式化程序 dateStyle 属性设置为 .long 并获得打印的正确年份(虽然不是我想要的格式)后,我意识到问题可能出在 dateFormat 中。>

阅读更多文档后,我找到了格式说明符的链接

最终我发现 Y 说明符本质上是“一周的一年”,而 y 说明符是“时代的一年”。

使用以下解决了我的问题:

let formatter = DateFormatter()
formatter.dateFormat = "d/y"
formatter.string(from: endOfMonth!) // $R1: String = "31/2020"

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