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)
}
我正在尝试使用 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)
}