【问题标题】:Getting start of month and end of month with time for December [duplicate]获取月份的开始和月份的结束时间以及 12 月的时间 [重复]
【发布时间】:2021-01-06 10:20:15
【问题描述】:

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

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

注意:如果您在 swift REPL 中尝试此操作,则会出现显示 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)

这看起来很好而且很花哨,因为时间是用 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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 如果您想要一个固定的日期格式,您应该将语言环境设置为“en_US_POSIX”。来自文档:如果您使用的是固定格式的日期,则应首先将日期格式化程序的语言环境设置为适合您的固定格式的内容。在大多数情况下,选择的最佳语言环境是“en_US_POSIX”,该语言环境专门设计用于生成美国英语结果,无论用户和系统偏好如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 2021-01-03
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多