如何确定特定时区内的当前时间是否在给定时间之后?

时间:2014-10-11 17:26:52

标签: ios xcode swift

让我举一个例子来说明我想要实现的目标: 假设我在香港[HKT]和我的应用程序,我需要知道美国/锡特卡当前时间是否在晚上5:30之后。 [我必须在一段时间后执行一段代码,并且会在某个时间继续这样做。]

现在在我的应用程序中,我有家庭时区和远程时区的信息。 (具有相同的NSTimeZone对象)

如果需要,我可以使用此代码打印两者的时间。

            var nTZ:NSTimeZone = NSTimeZone(name: "America/Sitka")

            var dateFormatter: NSDateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "hh:mm a"
            dateFormatter.timeZone = NSTimeZone(abbreviation: nTZ.abbreviation!)
            var remoteTime: NSSTring = dateFormatter.stringFromDate(NSDate())

现在问题是dateformatter将日期转换为字符串格式。我怎么知道目前在偏远地区的时间是在晚上5:30之后。基本上如何比较时间?

我也试过的一件事是扭转了NSDate的时间。即。获取String日期并转换回NSDate。想法是如果我可以将它转换为日期格式我将尝试某种比较(我还没有弄清楚。)//下面的代码是以前的代码的延续

    var dateFormatter2: NSDateFormatter = NSDateFormatter()
    dateFormatter2.dateFormat = "HH:mm a"
    var tempDateX:NSDate = dateFormatter2.dateFromString(remoteTime)!

    println(tempDateX)

这确实显示了一些值,但与原始日期不符。看起来它打印时间减去当前GMT偏移量。不知道为什么。

请帮我解决这个问题。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

示例:

var localTimeString = "5:30"
var localTZ = NSTimeZone.localTimeZone()

var remoteTimeString = "10:24"
var remoteTZ:NSTimeZone? = NSTimeZone(name: "America/Sitka")

var dateFormatter: NSDateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "HH:mm"

dateFormatter.timeZone = localTZ
var localDate:NSDate = dateFormatter.dateFromString(localTimeString)!
println("localDate: \(localDate)") // localDate: 2000-01-01 10:30:00 +0000

dateFormatter.timeZone = remoteTZ
var remoteDate:NSDate = dateFormatter.dateFromString(remoteTimeString)!
println("remoteDate: \(remoteDate)") // remoteDate: 2000-01-01 19:24:00 +0000

var isLater:NSComparisonResult = localDate.compare(remoteDate)
if isLater == .OrderedAscending {
    println("OrderedAscending")
}
else {
    println("OrderedDecending")
}

答案 1 :(得分:0)

如果将远程时间计算为“HHmm”,则任务变得更容易 使用24小时“HH”格式,因为那时你可以简单地比较一下 结果字符串为“1730”:

let dateformatter = NSDateFormatter()
dateformatter.timeZone = NSTimeZone(name: "America/Sitka")
dateformatter.dateFormat = "HHmm"
dateformatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")

let remoteTime = dateformatter.stringFromDate(NSDate())
if (remoteTime > "1730") {
    println("After 5:30 pm in Sitka")
}

(Posix语言环境设置为确保转换独立于 设备设置,比较 What is the best way to deal with the NSDateFormatter locale "feechur"?。)

或者,您可以用数字计算远程小时和分钟 使用NSDateComponents

let calendar = NSCalendar.currentCalendar()
calendar.timeZone = NSTimeZone(name: "America/Sitka")
let comp = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: NSDate())

// Or: if comp.hour * 100 + comp.minute > 17 * 100 + 30 { ...
if comp.hour > 17 || (comp.hour == 17 && comp.minute > 30) {
    println("After 5:30 pm in Sitka")
}