NSDateFormatter 删除时间时减去一天

NSDateFormatter subtracting a day when removing time

我正在尝试使用 NSDateFormatter 从日期中删除时间。这是代码:

func dateWithOutTime( datDate: NSDate?) -> NSDate {

    let formatter = NSDateFormatter()
    formatter.dateFormat = "dd-MM-yyyy"
    let stringDate: String = formatter.stringFromDate(datDate!)
    let dateFromString = formatter.dateFromString(stringDate)

return dateFromString!
}

如果我在 ex 04-01-2016 12:00:00 中发送,return 是 03-01-2016 23:00:00 我已经尝试更改日期格式,但它仍然会从日期中减去一天......为什么?请帮助:)

两件事:

(a) 这可以在不使用 NSDateFormatter 的情况下完成。 (b) 调用 print(aDate) 将为您提供 UTC 时间,而不是您的本地时间。在失去太多试图在精神上来回转换的脑细胞后,我决定扩展 NSDate 以在我当地的时区打印它。

// NSDateFormatter is expensive to create. Create it once and reuse
let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale.currentLocale()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZZ"

extension NSDate {
    // This will print the date in the local timezone
    var localTime: String {
        return dateFormatter.stringFromDate(self)
    }
}

func dateWithOutTime(datDate: NSDate?) -> NSDate {
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components([.Year, .Month, .Day], fromDate: datDate!)
    return calendar.dateFromComponents(components)!
}

let datDate = NSCalendar.currentCalendar().dateWithEra(1, year: 2016, month: 1, day: 4, hour: 12, minute: 0, second: 0, nanosecond: 0)
let result = dateWithOutTime(datDate)
print(result.localTime)

最简单的方法是使用 startOfDayForDate of NSCalendar

Swift 2:

func dateWithOutTime( datDate: NSDate) -> NSDate {
    return NSCalendar.currentCalendar().startOfDayForDate(datDate)
}

Swift 3+:

func dateWithOutTime(datDate: Date) -> Date {
    return Calendar.current.startOfDay(for: datDate)
}

或将时区调整为UTC/GMT

Swift 2:

func dateWithOutTime( datDate: NSDate) -> NSDate {
  let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
  calendar.timeZone = NSTimeZone(forSecondsFromGMT: 0)
  return calendar.startOfDayForDate(datDate)
}

Swift 3+:

func dateWithOutTime(datDate: Date) -> Date {
  var calendar = Calendar(identifier: .gregorian)
  calendar.timeZone = TimeZone(secondsFromGMT: 0)!
  return calendar.startOfDay(for: datDate)
}