NSDate到字符串显示比它应该多1小时

时间:2016-01-05 19:04:30

标签: swift

所以我正在制作一个小应用。我能够从两个UiDatePickers获得时间并获得它们之间的时差。我有一个NSDate,它具有正确的数字并且是正确的。但是当我使用stringFromDate时,时间增加了1小时。

这是我的代码:

         //recieves 2 time values from UiDatePickers and returns a NSTimeInterval
        let time = timeEndValue!.timeIntervalSinceDate(timeStartValue!)

        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "HH:mm"
        //Format NSTimeInterval to NSDate. date stores the correct value
        let date = NSDate(timeIntervalSinceReferenceDate: time)
        //The trouble starts here. Here the time get's one hour more than it should. 
        let dateString = dateFormatter.stringFromDate(date)

所以...作为NSDate的日期具有正确的值。我使用在线工具检查了它,将秒数转换为小时和分钟。但是当我用stringFromdate(date)转换日期时,输出显示比它应该多1小时。它每次我测试都会这样做。 我的猜测是它与时区有关,日期是UTC 0,我的时区是UTC + 1所以当它使用dateformatter.stringFromDate进行转换时,它会增加1小时或者什么。

任何想法的人?

编辑:

Rob建议使用NSDateComponentsFormatter,他是绝对正确的。结果如下:

let formatter = NSDateComponentsFormatter()
            formatter.allowedUnits = [.NSHourCalendarUnit, .NSMinuteCalendarUnit]
            formatter.unitsStyle = .Positional
            formatter.zeroFormattingBehavior = .Default
            stringV = formatter.stringFromDate(timeStartValue!, toDate: timeEndValue!)!

2 个答案:

答案 0 :(得分:2)

这是因为stringFromDate认为这是一个时间(不是经过的时间)并且在您的时区显示给您。您可以强制时区为UTC / GMT / Zulu,或者更好地使用NSDateComponentsFormatter来显示两个日期之间的时间量。例如:

let formatter = NSDateComponentsFormatter()
formatter.allowedUnits = [.Hour, .Minute]
formatter.unitsStyle = .Positional

let string = formatter.stringFromDate(date1, toDate: date2)

关于NSDateComponentsFormatter的好处是,它提供了许多其他好的格式化功能,例如其他unitsStyle(例如.Full将生成本地化字符串),{{1} (如果你有很长的时间段而宁愿只显示最重要的单位)等等。

如果您确实需要maximumUnitCount零填充格式,您还可以手动提取组件并根据需要对其进行格式化:

00:00

答案 1 :(得分:0)

我也有这个问题,但我只是通过将NSDateFormatter上的时区设置为'UTC'来解决它:

let time = time
let timeFormatter = NSDateFormatter()
timeFormatter.timeZone = NSTimeZone(name: "UTC")
timeFormatter.timeStyle = .ShortStyle