Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将时间字符串转换为NSDate?_Ios_Swift_Nsdate - Fatal编程技术网

Ios 如何将时间字符串转换为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

如何将时间字符串(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


只要我能比较这两个小时,使用哪种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)")