代码之家  ›  专栏  ›  技术社区  ›  Gargoyle

Swift日期操纵-奇怪的月份返回

  •  0
  • Gargoyle  · 技术社区  · 6 年前

    我正试图用斯威夫特进行一些约会操作,结果出乎意料。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 .

    我在太平洋标准时间,当然比东部标准时间早3个小时。如果我加上3个小时,我会得到预期的字符串。但是,既然输入和输出字符串都是使用时区的格式化程序完成的,为什么我不能得到预期的输出呢?

    1 回复  |  直到 6 年前
        1
  •  0
  •   rmaddy    6 年前

    问题是 Calendar.current 与格式化程序位于不同的时区(对于您)。

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

    日历。当前 )因此,您将在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)!
    

    这将产生预期的结果。