所以我正在制作一个小应用。我能够从两个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!)!
答案 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