如何将时间字符串(24小时格式)转换为NSDate进行比较?
我在这里得到的是错误的NSDate:
let a = "5:46"
let b = "24:30"
let dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = .ShortStyle
dateFormatter.dateFormat = "k:mm" // k = Hour in 1~24, mm = Minute
let outputA = dateFormatter.dateFromString(a)
let outputB = dateFormatter.dateFromString(b)
println("A: \(outputA) B: \(outputB)")
然后我得到
A: Optional(1999-12-31 20:46:00 +0000) B: nil
当我希望得到
时A: 5:46 AM B: 00:30 AM
或
A: 05:46 B: 24:30
只要我能比较这两个小时,哪个NSDate格式并不重要。
答案 0 :(得分:1)
在日期格式中添加NSTimeZone
。
let a = "5:46"
let b = "24:30"
let dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = .ShortStyle
dateFormatter.dateFormat = "k:mm" // k = Hour in 1~24, mm = Minute
let timeZone = NSTimeZone(name: "UTC")
dateFormatter.timeZone=timeZone
let outputA = dateFormatter.dateFromString(a)
let outputB = dateFormatter.dateFromString(b)
println("A: \(outputA) B: \(outputB)")
输出为:
Printing description of outputA:
2000-01-01 05:46:00 +0000
Printing description of outputB:
2000-01-01 00:30:00 +0000
答案 1 :(得分:1)
这里有三个完全不同的问题:
为什么第一次出现错误?
您在第一次约会时收到20:46
,因为您当地时区的5:46am
等于20:46 GMT
(+0000
的含义,GMT + 0)。所以不要担心看起来不同。简单的事实是,当地时区上午5:46 是 20:46 GMT + 0。
人们经常建议将格式化程序的timeZone
指定为GMT / UTC。在我看来,这是一个根本上有缺陷的方法。这有效,但它表明对基础问题的误解,NSDate
对象没有固有的概念时区。如果要在当前时区显示时间,则始终使用格式化程序。我假设当你说5:46 am时,你的意思是用户实际所在的早上5:46,而不是伦敦的5:46m。
显然,如果你说5:46,你真的是指格林威治标准时间5点46分(即在伦敦),那么很好,将时区设置为GMT。你会用RFC 3339或ISO 8601之类的互联网日期格式做很多事情,为了保持一致,我们会有意识地将所有内容改为GMT。但如果情况并非如此,我认为最好让格式化程序使用默认的timeZone
(您当前的时区),并且要注意NSLog
/ print
将始终显示时间GMT并知道,当您想在应用中显示时间时,请始终使用格式化程序为您当地的时区正确设置格式。
为什么第二个日期为nil
?
这个有点神秘。您的格式化程序错误(您应该使用dateFormat
或timeStyle
/ dateStyle
,但不能同时使用这两种格式,但我不认为这是问题所在。使用24:30
对美国人的眼睛有点好奇(我们通常会使用00:30
),但我想这在英国,中国,日本和香港等都不是闻所未闻。再加上你我正在使用k:mm
,所以我认为它会接受24:30
。不过,k:mm
格式化程序字符串对我来说很好。
底线我无法重现您描述的nil
行为。也许您可以告诉我们您正在使用的区域设置,只使用dateFormat
,而不是timeStyle
。
为什么输出时间格式不正确?
如果将原始字符串解析为NSDate
个对象,如果要以某种预定格式创建新的输出字符串,那么您使用另一个格式化程序来转换{ {1}}返回所需格式的字符串。
NSDate
在我的电脑上输出:
dateA:可选(2000-01-01 10:46:00 +0000)dateB:可选(2000-01-01 05:30:00 +0000)
stringA:上午5:46 stringB:12:30
日期是那些时间被正确解析为let a = "5:46"
let b = "24:30"
let inputFormatter = NSDateFormatter()
inputFormatter.dateFormat = "k:mm" // k = Hour in 1~24, mm = Minute
let dateA = inputFormatter.dateFromString(a)
let dateB = inputFormatter.dateFromString(b)
println("dateA: \(dateA) dateB: \(dateB)")
let outputFormatter = NSDateFormatter()
outputFormatter.timeStyle = .ShortStyle
let stringA = outputFormatter.stringFromDate(dateA!) // these only work if the date is not `nil`
let stringB = outputFormatter.stringFromDate(dateB!)
println("stringA: \(stringA) stringB: \(stringB)")
个对象(以GMT输出它们的值,NSDate
),然后根据您提供的任何样式/格式重新转换为输出字符串。
显然,这假设您解决了+0000
为dateB
的问题。请提供有关您的配置的更多信息和/或向我们提供MCVE。但我无法重现你描述的行为。
答案 2 :(得分:0)
您可以针对您的问题尝试以下代码。
let a = "5:46"
let b = "24:30"
let dtf = NSDateFormatter()
dtf.timeZone = NSTimeZone(name: "UTC")
dtf.dateFormat = "HH:mm"
let date : NSDate = dtf.dateFromString(a)!
let date1 : NSDate = dtf.dateFromString(b)!
println("\(date)","\(date1)")
注意:如果您使用24小时时间格式,那么您不需要采取" 24:30"和NSDate对象永远不会给你时间。如果您将使用我在上面的代码中提到的格式,它将始终返回日期。