从没有“时区校正”的组件创建 NSDate

Posted

技术标签:

【中文标题】从没有“时区校正”的组件创建 NSDate【英文标题】:Creating NSDate from components without "timezone correction" 【发布时间】:2015-03-01 10:08:36 【问题描述】:

我有一个函数

func createDate(day: Int, month: Int, year: Int) -> NSDate 
    var comp = NSDateComponents()
    comp.day = day
    comp.month = month
    comp.year = year

    var cal = NSCalendar.currentCalendar()

    if var date = cal.dateFromComponents(comp) 
        return date
    

    return NSDate()

如果我用它来称呼它

createDate(07, 01, 1984)

输出为1984-01-06 23:00:00 +0000。我认为时区有一些影响。如何调整我的代码以使输出为1984-01-07 00:00:00 +0000?我在这里做错了什么?我怎么糊涂了?

【问题讨论】:

***.com/questions/4976530/… 正如其他人所说,一个 NSDate 对象总是包含 UTC 时间(或其一些概念版本),这就是你 NSLog 时打印的内容。要查看正确的日期/时间,请使用 NSDateFormatter 设置为您的时区。 【参考方案1】:

不需要使用 NSDateComponents 来输入时间。 NSCalendar 已经有一种方法可以让您使用本地时间输入日期。它被称为 dateWithEra。 “+0000”不是您的本地时间 (CET),而是 UTC 时间。您的 timeZone 不与您的 NSDate 对象一起存储,只有您的 localTime 输入的相应 UTC 日期和时间。

let myDate = NSCalendar.currentCalendar().dateWithEra(1, year: 1984, month: 1, day: 7, hour: 0, minute: 0, second: 0, nanosecond: 0)!


myDate.descriptionWithLocale(NSLocale.currentLocale())!   // "Saturday, January 7, 1984 at 12:00:00 AM Brasilia Standard Time"


NSTimeZone.localTimeZone().secondsFromGMT

【讨论】:

【参考方案2】:

不用担心日志输出。这将是一个未格式化的日期。实际日期似乎正是您想要的。

如果您想显示确切的日期,您必须使用NSDateFormatter 显示它。

【讨论】:

以上是关于从没有“时区校正”的组件创建 NSDate的主要内容,如果未能解决你的问题,请参考以下文章

从没有密钥的代码创建 XAML 资源

在 PHP 中从没有 ffmpeg 的视频创建缩略图

从字符串创建NSDate

在运行时创建的控件没有窗口。无法从没有窗口的视图中显示弹出框

如何使用 scala spark 从没有标题且有超过 150 列的 csv 创建数据集

使用 DateComponent 构造 NSDate 会产生不一致的结果