我正在尝试根据GMT时间获得时差。其中在每天结束时,计时器重置为零。我在Xcode模拟器上尝试了以下代码,每次我在mac上更改时间,差异也会改变。
我该如何将午夜前的时间设置为一个时区,即使时区发生了变化,计时器的差异也始终相同。
func updateTimeGMT(){
let date = NSDate()
var formatter = NSDateFormatter()
var addDay = date.dateByAddingTimeInterval(60*60*24*2)
formatter.timeZone = NSTimeZone(abbreviation: "GMT+5:30")
formatter.dateStyle = NSDateFormatterStyle.LongStyle
formatter.timeStyle = NSDateFormatterStyle.LongStyle
let localDate = formatter.stringFromDate(addDay)
let datefrom = formatter.dateFromString(localDate)
let currentDate = formatter.stringFromDate(date)
let currentDateFrom = formatter.dateFromString(currentDate)
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
let startOfToday = NSCalendar.currentCalendar().startOfDayForDate(datefrom!)
let newDate = cal!.startOfDayForDate(addDay)
var currentTime = currentDateFrom?.timeIntervalSinceReferenceDate
var elapsedTime : NSTimeInterval = newDate.timeIntervalSinceReferenceDate - currentTime!
println("(newDate) elapsed : (currentDateFrom)")
let hours = UInt(elapsedTime/60/60)
elapsedTime -= (NSTimeInterval(hours)*60*60)
let minutes = UInt(elapsedTime/60.0)
elapsedTime -= (NSTimeInterval(minutes)*60)
let seconds = UInt(elapsedTime)
elapsedTime -= NSTimeInterval(seconds)
let fraction = UInt(elapsedTime * 100)
let strHours = String(format: "%02d", hours)
let strMinutes = String(format: "%02d", minutes)
let strSeconds = String(format: "%02d", seconds)
let strFraction = String(format: "%02d", fraction)
countingLabel.text = "(strHours) : (strMinutes) : (strSeconds) : (strFraction)"
}
我认为您的问题是使用了一个未设置时区的日历。
您将60*60*24*2
添加到当前时间的计算不考虑某些时区更改为夏令时和从夏令时更改为夏时制的两天。这两天分别是23小时和25小时。
let calendar = NSCalendar.autoupdatingCurrentCalendar()
let now = NSDate()
var startOfDay = NSDate?()
var lengthOfDaySeconds : NSTimeInterval = 0
if (calendar.rangeOfUnit(NSCalendarUnit.Day,
startDate:&startOfDay,
interval:&lengthOfDaySeconds,
forDate: now)) {
let endOfDay = startOfDay?.dateByAddingTimeInterval(lengthOfDaySeconds)
if let secondsUntilEndOfDay = endOfDay?.timeIntervalSinceDate(now) {
var timeLeft = secondsUntilEndOfDay
let hours = floor(timeLeft / 3600.0)
timeLeft -= (hours * 3600.0)
let minutes = floor(timeLeft / 60.0)
timeLeft -= (minutes * 60.0)
let seconds = floor(timeLeft)
timeLeft -= seconds
let fraction = floor(timeLeft * 100)
let strHours = String(format: "%02d", UInt(hours))
let strMinutes = String(format: "%02d", UInt(minutes))
let strSeconds = String(format: "%02d", UInt(seconds))
let strFraction = String(format: "%02d", UInt(fraction))
countingLabel.text = "(strHours) : (strMinutes) : (strSeconds) : (strFraction)"
}
}