NSCalendar.dateFromComponents 的令人困惑的结果

Confusing result of NSCalendar.dateFromComponents

我尝试使用此 Swift 代码获取不带小时和分钟的当前日期:

let calendar = NSCalendar.currentCalendar()

let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: NSDate())

println(components)

let date = calendar.dateFromComponents(components)

println(date)

我用 println 得到的结果让我有点困惑:

<NSDateComponents: 0x7fb5ad867700>
    Calendar Year: 2015
    Month: 7
    Leap month: no
    Day: 2

2015-07-01 22:00:00 +0000

components 是 2015-07-02 但结果 date 是 2015-07-01 22:00:00

我的错误在哪里?


A 提到 NSDateFormatter 结果很好:

var dateFormatter = NSDateFormatter()

dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle

println(dateFormatter.stringFromDate(date!))

结果:

July 2, 2015 at 12:00 AM

推进是 println(date) 的工作方式。它使用 NSDatedescription 方法和 returns 参考 GMT (UTC) 的数据。因此,根据您与格林威治标准时间的时区偏移,您会看到差异。

在输出“2015-07-01 22:00:00 +0000”中,请注意结尾的“+0000”,这是时区偏移量,即 GMT,而不是您的时区。

结果是使用日期格式化程序并指定时区,对于设备的时区,您可以使用系统时区:[NSTimeZone systemTimeZone]NSTimeZone.systemTimeZone() for Swift。