NSDate(或 Swift ≥ V3 中的 Date)没有时区。它记录了世界各地的时间瞬间。
在内部,日期对象记录自“纪元日期”(或 2001 年 1 月 1 日午夜)以来的秒数格林威治标准时间 https://en.wikipedia.org/wiki/Greenwich_Mean_Time,又名 UTC。
我们通常会想到我们当地时区的日期。
如果您使用以下方式记录日期
print(NSDate())
系统显示当前日期,但以 UTC/格林威治标准时间表示。因此,时间看起来正确的唯一地方就是该时区。
如果发出调试器命令,您会在调试器中遇到相同的问题
e NSDate()
这是一种痛苦。我个人希望 iOS/Mac OS 能够使用用户当前时区显示日期,但事实并非如此。
EDIT #2:
对我之前使用本地化字符串的改进是创建一个扩展,使其更易于使用Date
class:
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)
EDIT:
我刚刚发现NSDateFormatter
(DateFormatter
在 Swift 3) 有一个类方法 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 形式的类别:(文件名 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 版本放入您的所有项目中。
然后你可以使用
Swift 2:
print(NSDate().localDateString())
Swift 3:
print(Date().localDateString())