从没有“时区校正”的组件创建 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的主要内容,如果未能解决你的问题,请参考以下文章
在运行时创建的控件没有窗口。无法从没有窗口的视图中显示弹出框