快速日期操作-奇怪的月份返回

时间:2019-01-01 02:14:56

标签: swift date-formatting

我正在尝试使用Swift进行一些日期操作,但得到了意外的结果。该Web服务将传递一个字符串日期,然后我要获取该月和上个月。我正在使用此代码(已删除输入抓取和删除):

import Foundation

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(identifier: "America/New_York")
formatter.dateFormat = "yyyy-MM-dd"

let date = formatter.date(from: "2018-12-01")!
let prev = Calendar.current.date(byAdding: .month, value: -1, to: date)!

formatter.string(from: date)
formatter.string(from: prev)

所以我有一个有效的日期,然后从中减去一个月。第一个格式化的日期显示了我期望的2018-12-01,但随后在第二行显示了2018-11-01,而不是2018-10-31

我正在PST,当然要比EST早3个小时。如果我增加3个小时,我会得到预期的字符串。但是,由于输入和输出字符串都是使用时区的格式化程序完成的,为什么我没有得到预期的输出?

1 个答案:

答案 0 :(得分:0)

问题是Calendar.current与格式化程序不在同一时区。

所以date是2018年12月1日,纽约时间午夜。但这就是您当地时间(PST)2018年11月30日晚上9点。

当您减去一个月时,将在当地时间(Calendar.current)完成,因此您将在2018年10月30日晚上9点到达。然后将日期格式化为纽约时间,结果是2018年10月31日午夜。

要获得正确的结果,您希望日历与格式程序位于同一时区:

var cal = Calendar(identifier: Calendar.current.identifier)
cal.timeZone = formatter.timeZone
let prev = cal.date(byAdding: .month, value: -1, to: date)!

这将提供预期的结果。