Swift 日期操作 - 奇怪的月份 return
Swift date manipulation - strange month return
我正在尝试使用 Swift 进行一些日期操作,但得到了意想不到的结果。 webservice会传入一个字符串日期,然后我想得到那个月和上个月。我正在使用此代码(删除了输入抓取等):
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
。
我在太平洋标准时间,当然比美国东部时间早 3 小时。如果我增加 3 小时,我会得到预期的字符串。但是,由于输入和输出字符串都是使用时区的格式化程序完成的,为什么我没有得到预期的输出?
问题是 Calendar.current
与格式化程序处于不同的时区(对您而言)。
所以 date
是纽约时间 2018 年 12 月 1 日午夜。但那是当地时间 2018 年 11 月 30 日晚上 9 点 (PST)。
当你减去一个月时,它是在当地时间 (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)!
这将给出预期的结果。
我正在尝试使用 Swift 进行一些日期操作,但得到了意想不到的结果。 webservice会传入一个字符串日期,然后我想得到那个月和上个月。我正在使用此代码(删除了输入抓取等):
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
。
我在太平洋标准时间,当然比美国东部时间早 3 小时。如果我增加 3 小时,我会得到预期的字符串。但是,由于输入和输出字符串都是使用时区的格式化程序完成的,为什么我没有得到预期的输出?
问题是 Calendar.current
与格式化程序处于不同的时区(对您而言)。
所以 date
是纽约时间 2018 年 12 月 1 日午夜。但那是当地时间 2018 年 11 月 30 日晚上 9 点 (PST)。
当你减去一个月时,它是在当地时间 (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)!
这将给出预期的结果。