如何将时间字符串转换为NSDate?

时间:2015-07-04 04:38:17

标签: 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 = 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格式并不重要。

3 个答案:

答案 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)

这里有三个完全不同的问题:

  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并知道,当您想在应用中显示时间时,请始终使用格式化程序为您当地的时区正确设置格式。

  2. 为什么第二个日期为nil

    这个有点神秘。您的格式化程序错误(您应该使用dateFormattimeStyle / dateStyle,但不能同时使用这两种格式,但我不认为这是问题所在。使用24:30对美国人的眼睛有点好奇(我们通常会使用00:30),但我想这在英国,中国,日本和香港等都不是闻所未闻。再加上你我正在使用k:mm,所以我认为它会接受24:30。不过,k:mm格式化程序字符串对我来说很好。

    底线我无法重现您描述的nil行为。也许您可以告诉我们您正在使用的区域设置,只使用dateFormat,而不是timeStyle

  3. 为什么输出时间格式不正确?

    如果将原始字符串解析为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),然后根据您提供的任何样式/格式重新转换为输出字符串。

  4. 显然,这假设您解决了+0000dateB的问题。请提供有关您的配置的更多信息和/或向我们提供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对象永远不会给你时间。如果您将使用我在上面的代码中提到的格式,它将始终返回日期。