iOS NSDate() returns 时间不正确
iOS NSDate() returns incorrect time
我正在尝试使用 NSDate()
在 Swift 中获取当前日期。当我创建断点并停止应用程序时,我可以看到与设备的系统时间有 3 小时的差异。申请 运行 实际 iPhone。如何解决这个问题?
我在App Delegate中也写了以下内容以确保:
NSTimeZone.setDefaultTimeZone(NSTimeZone(name: "Europe/Kiev")!)
但是还是不行。
return 时间不对。 return正是时候。 NSDate 没有任何时区信息。现在,当我们调用 NSDate() 时,我的计算机和您的计算机将报告完全相同的时间。
NSLog 以 UTC 显示 NSDate。这就是它显示的内容。因此,如果我们现在都调用 NSLog,您的计算机将记录与我的相同的日期和时间。因为是同一个日期和时间。
如果您想处理 NSDate(例如,向用户显示日期和时间),您可以使用 NSCalendar。 NSCalendar 在 NSDate 之间进行转换,NSDate 在世界各地都是一样的,到您想要在用户界面中显示的值,这在伦敦或基辅会有所不同。如果我现在看我的手表,我会看到一个与你在手表上看到的不同的时间,这就是 NSCalendar 的用途。
对于 Swift 2.2 这个函数对我有用:
func getCurrentLocalDate()-> NSDate {
var now = NSDate()
let nowComponents = NSDateComponents()
let calendar = NSCalendar.currentCalendar()
nowComponents.year = NSCalendar.currentCalendar().component(NSCalendarUnit.Year, fromDate: now)
nowComponents.month = NSCalendar.currentCalendar().component(NSCalendarUnit.Month, fromDate: now)
nowComponents.day = NSCalendar.currentCalendar().component(NSCalendarUnit.Day, fromDate: now)
nowComponents.hour = NSCalendar.currentCalendar().component(NSCalendarUnit.Hour, fromDate: now)
nowComponents.minute = NSCalendar.currentCalendar().component(NSCalendarUnit.Minute, fromDate: now)
nowComponents.second = NSCalendar.currentCalendar().component(NSCalendarUnit.Second, fromDate: now)
nowComponents.timeZone = NSTimeZone(abbreviation: "GMT")
now = calendar.dateFromComponents(nowComponents)!
return now
}
如果你想要一个不同的时区,你可以直接改变它,或者更好的是,将它作为函数参数传递。
这是 swift 3.0 的转换:
func getCurrentLocalDate()-> Date {
var now = Date()
var nowComponents = DateComponents()
let calendar = Calendar.current
nowComponents.year = Calendar.current.component(.year, from: now)
nowComponents.month = Calendar.current.component(.month, from: now)
nowComponents.day = Calendar.current.component(.day, from: now)
nowComponents.hour = Calendar.current.component(.hour, from: now)
nowComponents.minute = Calendar.current.component(.minute, from: now)
nowComponents.second = Calendar.current.component(.second, from: now)
nowComponents.timeZone = TimeZone(abbreviation: "GMT")!
now = calendar.date(from: nowComponents)!
return now as Date
}
您还可以使用 Locale 获取当前时间和日期。
let today = NSDate()
let locale = NSLocale.current
print("Time of today: \(today.description(with: locale))")
此函数 returns 现在处于当前时区。
func convertDate(date:Date) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
var comp = DateComponents()
let calendar = Calendar.current
comp.year = Calendar.current.component(.year, from: date)
comp.month = Calendar.current.component(.month, from: date)
comp.day = Calendar.current.component(.day, from: date)
comp.hour = Calendar.current.component(.hour, from: date)
comp.minute = Calendar.current.component(.minute, from: date)
comp.second = Calendar.current.component(.second, from: date)
comp.timeZone = TimeZone(abbreviation: "GMT")
var dateFromCalendar = Date()
if let calendarDate = calendar.date(from: comp) {
dateFromCalendar = calendarDate
}
return dateFromCalendar
}
使用:
let now = Date()
let convertedDate = convertDate(date: now)
还值得检查一下您的测试设备 Date/Time 是否设置为较旧的日期。
我正在尝试使用 NSDate()
在 Swift 中获取当前日期。当我创建断点并停止应用程序时,我可以看到与设备的系统时间有 3 小时的差异。申请 运行 实际 iPhone。如何解决这个问题?
我在App Delegate中也写了以下内容以确保:
NSTimeZone.setDefaultTimeZone(NSTimeZone(name: "Europe/Kiev")!)
但是还是不行。
return 时间不对。 return正是时候。 NSDate 没有任何时区信息。现在,当我们调用 NSDate() 时,我的计算机和您的计算机将报告完全相同的时间。
NSLog 以 UTC 显示 NSDate。这就是它显示的内容。因此,如果我们现在都调用 NSLog,您的计算机将记录与我的相同的日期和时间。因为是同一个日期和时间。
如果您想处理 NSDate(例如,向用户显示日期和时间),您可以使用 NSCalendar。 NSCalendar 在 NSDate 之间进行转换,NSDate 在世界各地都是一样的,到您想要在用户界面中显示的值,这在伦敦或基辅会有所不同。如果我现在看我的手表,我会看到一个与你在手表上看到的不同的时间,这就是 NSCalendar 的用途。
对于 Swift 2.2 这个函数对我有用:
func getCurrentLocalDate()-> NSDate {
var now = NSDate()
let nowComponents = NSDateComponents()
let calendar = NSCalendar.currentCalendar()
nowComponents.year = NSCalendar.currentCalendar().component(NSCalendarUnit.Year, fromDate: now)
nowComponents.month = NSCalendar.currentCalendar().component(NSCalendarUnit.Month, fromDate: now)
nowComponents.day = NSCalendar.currentCalendar().component(NSCalendarUnit.Day, fromDate: now)
nowComponents.hour = NSCalendar.currentCalendar().component(NSCalendarUnit.Hour, fromDate: now)
nowComponents.minute = NSCalendar.currentCalendar().component(NSCalendarUnit.Minute, fromDate: now)
nowComponents.second = NSCalendar.currentCalendar().component(NSCalendarUnit.Second, fromDate: now)
nowComponents.timeZone = NSTimeZone(abbreviation: "GMT")
now = calendar.dateFromComponents(nowComponents)!
return now
}
如果你想要一个不同的时区,你可以直接改变它,或者更好的是,将它作为函数参数传递。
这是 swift 3.0 的转换:
func getCurrentLocalDate()-> Date {
var now = Date()
var nowComponents = DateComponents()
let calendar = Calendar.current
nowComponents.year = Calendar.current.component(.year, from: now)
nowComponents.month = Calendar.current.component(.month, from: now)
nowComponents.day = Calendar.current.component(.day, from: now)
nowComponents.hour = Calendar.current.component(.hour, from: now)
nowComponents.minute = Calendar.current.component(.minute, from: now)
nowComponents.second = Calendar.current.component(.second, from: now)
nowComponents.timeZone = TimeZone(abbreviation: "GMT")!
now = calendar.date(from: nowComponents)!
return now as Date
}
您还可以使用 Locale 获取当前时间和日期。
let today = NSDate()
let locale = NSLocale.current
print("Time of today: \(today.description(with: locale))")
此函数 returns 现在处于当前时区。
func convertDate(date:Date) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
var comp = DateComponents()
let calendar = Calendar.current
comp.year = Calendar.current.component(.year, from: date)
comp.month = Calendar.current.component(.month, from: date)
comp.day = Calendar.current.component(.day, from: date)
comp.hour = Calendar.current.component(.hour, from: date)
comp.minute = Calendar.current.component(.minute, from: date)
comp.second = Calendar.current.component(.second, from: date)
comp.timeZone = TimeZone(abbreviation: "GMT")
var dateFromCalendar = Date()
if let calendarDate = calendar.date(from: comp) {
dateFromCalendar = calendarDate
}
return dateFromCalendar
}
使用:
let now = Date()
let convertedDate = convertDate(date: now)
还值得检查一下您的测试设备 Date/Time 是否设置为较旧的日期。