当我尝试记录当前日期时:
print(NSDate())
或
print(Date())
(在Swift 3中)
或任何日期对象,它显示错误的时间。例如,现在大概是16:12,但上面显示了
2016-10-08 20:11:40 +0000
我的约会时间是否错误?如何修复日期以获得正确的时区?
为什么会这样,以及如何修复它?如何在打印语句或调试器中轻松地在本地时区显示任意日期?
(请注意,这个问题是一个“振铃”,因此我可以提供一个简单的Swift 3 / Swift 2 Date / NSDate扩展,让您可以轻松地在当地时区显示任何日期对象。
答案 0 :(得分:16)
NSDate(或Swift中的日期≥V3)没有时区。它记录了世界各地的瞬间。
在内部,日期对象记录自“{纪要日期”以来的秒数,或2001年1月1日的午夜,Greenwich Mean Time,a.k.a UTC。
我们通常会考虑当地时区的日期。
如果使用
记录日期print(NSDate())
系统显示当前日期,但以UTC /格林威治标准时间表示。所以时间看起来正确的唯一地方是那个时区。
如果发出调试器命令
,调试器中会出现同样的问题e NSDate()
这是一种痛苦。我个人希望iOS / Mac OS能够使用用户的当前时区显示日期,但他们没有。
我以前使用本地化字符串的改进使其更容易使用,即创建Date
类的扩展名:
extension Date {
func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
}
}
这样你可以使用像Date().localString()
这样的表达式,或者如果你只想打印时间,你可以使用Date().localString(dateStyle:.none)
我刚刚发现NSDateFormatter
(Swift 3中的DateFormatter
)有一个类方法localizedString。这就是我的扩展程序所做的,但更简单,更干净。这是宣言:
class func localizedString(from date: Date, dateStyle dstyle: DateFormatter.Style, timeStyle tstyle: DateFormatter.Style) -> String
所以你只需使用
let now = Date()
print (DateFormatter.localizedString(
from: now,
dateStyle: .short,
timeStyle: .short))
你几乎可以忽略下面的一切。
我创建了一个NSDate类的类别(swift 3中的Date),它有一个方法localDateString,用于在用户的本地时区显示日期。
以下是Swift 3格式的类别:(filename Date_displayString.swift)
extension Date {
@nonobjc static var localFormatter: DateFormatter = {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateStyle = .medium
dateStringFormatter.timeStyle = .medium
return dateStringFormatter
}()
func localDateString() -> String
{
return Date.localFormatter.string(from: self)
}
}
以Swift 2形式:
extension NSDate {
@nonobjc static var localFormatter: NSDateFormatter = {
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateStyle = .MediumStyle
dateStringFormatter.timeStyle = .MediumStyle
return dateStringFormatter
}()
public func localDateString() -> String
{
return NSDate.localFormatter.stringFromDate(self)
}
}
(如果您更喜欢不同的日期格式,则可以很容易地修改日期格式化程序使用的格式。在您需要的任何时区显示日期和时间也很简单。)
我建议在所有项目中放置相应的Swift 2 / Swift 3版本的文件。
然后您可以使用
斯威夫特2:
print(NSDate().localDateString())
斯威夫特3:
print(Date().localDateString())
答案 1 :(得分:0)
更正时区的日期的一种简单方法是使用TimeZone.current.secondsFromGMT()
对于本地时间戳值,例如这样的事情:
let currentLocalTimestamp = (Int(Date().timeIntervalSince1970) + TimeZone.current.secondsFromGMT())