【发布时间】:2021-01-06 10:20:15
【问题描述】:
正如标题所示,我正在尝试使用 12 月的时间组件来获取月份的开始和结束。我确定我遗漏了与 TimeZones 相关的明显内容,但在 PST 时区的两个日期中,我似乎无法获得相同的年份。
这是我如何获得月份和日期的开始:
注意:如果您在 swift REPL 中尝试此操作,则会出现显示 nil 结果的错误,即使 变量有一个非零值,使用
debugPrint显示该值。
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)
这看起来很好而且很花哨,因为时间是用 GMT (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 年吗?
【问题讨论】:
-
在年初总是有很多这样的问题,因为
Y年份说明符的误用 在今年剩下的时间里没有效果????
标签: swift date datetime nsdateformatter