Ios 如何将时间字符串转换为NSDate?
如何将时间字符串(24小时格式)转换为NSDate进行比较 我在这里得到零和错误的NSDate:Ios 如何将时间字符串转换为NSDate?,ios,swift,nsdate,Ios,Swift,Nsdate,如何将时间字符串(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 = dateFormatt
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
或
只要我能比较这两个小时,使用哪种NSDate格式并不重要。在日期格式中添加
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
这里有三个完全不同的问题:
20:46
,因为当地时区的5:46am
等于20:46GMT
(这就是+0000
的意思,GMT+0)。所以不要担心它看起来不一样。简单的事实是,当地时区的上午5:46是格林威治标准时间20:46+0
人们经常建议将格式化程序的时区指定为GMT/UTC。在我看来,这是一个根本上有缺陷的方法。这是可行的,但它表明了对根本问题的误解,NSDate
对象没有固有的时区概念。如果要显示当前时区中的时间,请始终使用格式化程序。我想当你说早上5:46时,你指的是早上5:46用户实际所在的位置,而不是伦敦的5:46
显然,如果你说5:46,你的意思是5:46格林威治标准时间(即在伦敦),那么很好,将时区设置为格林威治标准时间。在互联网日期格式(如RFC 3339或ISO 8601)中,你会经常这样做,为了一致性,我们会有意识地将所有内容更改为格林威治标准时间。但如果不是这样的话,我认为最好让格式化程序使用默认的时区(您当前的时区),并且只需注意NSLog
/print
将始终以GMT显示时间,并且知道当您想在应用程序中显示时间时,始终使用格式化程序为您的本地时区正确格式化
dateFormat
或timeStyle
/dateStyle
,但不能同时使用这两种格式),但我认为这不是问题所在。使用<代码> 2430对我们的眼睛有点好奇(我们通常使用<代码> 00 30/<代码>),但我猜它在英国、中国、日本和香港等国家都是闻所未闻的,加上你使用的是<代码> k:mm ,所以我想它会接受<代码> 2430。不过,k:mm
格式化程序字符串对我来说工作得很好
总之,我无法重现您描述的nil
行为。也许您可以告诉我们您使用的是什么语言环境,并且只使用dateFormat
,而不使用timeStyle
NSDate
对象后,您希望以某种预定格式创建新的输出字符串,那么您将使用另一个格式化程序将该NSDate
转换回所需格式的字符串
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)")
在我的计算机上,它输出:
日期a:可选(2000-01-01 10:46:00+0000)日期b:可选(2000-01-01 05:30:00+0000)
stringA:5:46上午stringB:12:30上午
日期是将时间正确解析为NSDate
对象(以GMT为单位输出其值,+0000
)的时间,然后根据您提供的任何样式/格式重新转换为输出字符串显然,这假设您解决了
dateB
为nil
的问题。请提供有关您的配置的更多信息和/或向我们提供详细信息。但是我无法重现您描述的行为。您可以尝试以下代码来解决您的问题
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对象永远不会给您唯一的时间。如果您使用我在上述代码中提到的格式,它也将始终返回日期。您想分别获取小时和分钟吗?我已经添加了一个答案。这是不是为你工作@朱。P
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)")