从 NSUserDefaults (Swift) 中的双精度值中检索日期

Retrieve date from double value in NSUserDefaults (Swift)

您好,我正在创建一个具有两个控件的控件:一个 NSSlider 和一个不断更新的 NSTextField。我向 NSTextField 添加了一个 NSDateFormatter,以便它显示格式化为时间的滑块的当前值。滑块的范围为 0 到 86,400 个单位(以便用户在 24 小时的范围内滑动秒数)。

我将我的应用程序连接到共享用户默认控制器,以便为用户存储该值。

该应用在 NSTextField 中显示正确的时间,但它始终以秒为单位存储值。例如,如果用户在移动滑块时选择了06:32:14,那么系统实际上会在键startTime

中存储23534.2261709793

当用户再次打开该应用时,他们将按预期看到 06:32:14。

我的问题是当我想读取代码中的变量时:

我可以将值读取为 Double:

let value = NSUserDefaults.standardUserDefaults().objectForKey("startTimeValue") as? Double

这工作正常,如果我尝试将其转换为 NSDate,它将无法工作(值将设置为 nil)。所以我认为在代码中使用 NSDateFormatter 是可行的(因为这是界面构建器为用户查看日期所做的工作的方式):

 let dateFormatter = NSDateFormatter()
 dateFormatter.dateStyle = NSDateFormatterStyle.NoStyle
 dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
 let date = dateFormatter.dateFromString((value?.description)!)

在前面的代码中我创建了日期格式化程序,然后将日期样式设置为空(我只想做时间),并将时间样式设置为短。但是给出 value.description ("23534.2261709793") 仍然无效。日期仍为零。

我做错了什么吗?

您从 NSUserDefaults 存储/获取的双精度值是从 1970 年 1 月 1 日星期四开始的时间间隔。因此您需要将该时间间隔输入 NSDate 构造函数,以便它可以为您构造日期。

let value = NSUserDefaults.standardUserDefaults().objectForKey("startTimeValue") as? Double
let date = NSDate(timeIntervalSince1970: value)