首页 > 解决方案 > Swift DateFormatter 错误地转换字符串日期/时间

问题描述

我正在尝试将如下所示的时间字符串转换为 Swift 日期:

太阳 11:00a PDT

太阳 7:00p PDT

周一 11:00a PDT

周一 7:00p PDT

周二 11:00a PDT

周二 7:00p PDT

周三 10:00a PDT

周三 7:00p PDT

ETC

这些代表各种业务的开放和关闭时间。

虽然 Date 对象转换确实成功(意味着返回的可选项不是nil),但时间不正确。这是我的代码:

let dateFormatter = DateFormatter()
let shortDays = ["Sun-","Mon-","Tue-","Wed-","Thu-","Fri-","Sat-"]
            
dateFormatter.dateFormat = "E HH:mmaaaaa zzz"
var daysCounter = 0
            
for hours in hoursArray {
    let dayHours = shortDays[daysCounter]+hours
                
    //split hours
    let splitHours = dayHours.split(separator: "-")
    //print(String(splitHours[0]+" "+splitHours[1]+" "+timezone))
    //print(String(splitHours[0]+" "+splitHours[2]+" "+timezone))
    //create an opening time date optional
                
    let openingOpt = dateFormatter.date(from: String(splitHours[0]+" "+splitHours[1]+" "+timezone))
                
    //create a closing time date optional
    let closingOpt = dateFormatter.date(from: String(splitHours[0]+" "+splitHours[2]+" "+timezone))
                
    //unwrap those optionals
    guard let opening = openingOpt else{
    //deal with "closed"
        print("Something happened with unwrapping opening time optional: \(String(describing: openingOpt))")
        return
    }
                
    guard let closing = closingOpt else{
                    //deal with "closed"
        print("Something happened with unwrapping closing time optional: \(String(describing: closingOpt))")
        return
    }
                
    self.fullHours.append(opening)
    self.fullHours.append(closing)
    daysCounter += 1
}
for hours in fullHours{
    print(hours)
}

但是,当我使用上面的 for 循环打印转换后的日期时,我得到了不正确的结果。有些结果很好;例如,晚上 7 点的关闭时间似乎可以正确转换。左边是打印的 Date 对象,右边是括号中的原始输入:

2000-01-02 07:00:00 +0000(太平洋夏令时间周日 11:00)

2000-01-02 19:00:00 +0000(太平洋夏令时间周日 7:00)

2000-01-03 07:00:00 +0000(太平洋夏令时间周一 11:00)

2000-01-03 19:00:00 +0000(太平洋夏令时间周一 7:00p)

2000-01-04 07:00:00 +0000(太平洋夏令时间周二 11:00)

2000-01-04 19:00:00 +0000(太平洋夏令时间周二 7:00)

2000-01-05 07:00:00 +0000(太平洋夏令时间周三 10:00)

2000-01-05 19:00:00 +0000(太平洋夏令时间星期三 7:00p)

2000-01-06 07:00:00 +0000(太平洋夏令时间周四 11:00)

2000-01-06 19:00:00 +0000(星期四 7:00p PDT)

2000-01-07 07:00:00 +0000(太平洋夏令时间周五 11:00)

2000-01-07 19:00:00 +0000(太平洋夏令时间星期五晚上 7:00)

12000-01-01 07:00:00 +0000(太平洋夏令时间周六 11:00)

2000-01-01 19:00:00 +0000(星期六 7:00p PDT)

特别是,为什么星期六要转换为 12000 年?为什么周三上午 10 点仍显示在 UTC 上午 7 点?我很困惑和迷失,无法通过搜索找到类似的问题。任何帮助将不胜感激,谢谢!

注意:我使用的是 Xcode 13.0 Beta 5,为 iOS 15 beta 5 开发。

编辑:这里是日期时间格式的来源:http ://www.unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns

Edit2:另外,我发现任何附加“a”的时间都会转换为上午 7 点,任何附加“p”的时间都会转换为晚上 7 点。所以... ??

标签: iosswiftiphonedate

解决方案


答案是我的格式关闭了。它应该是 h:mm,而不是 HH:mm。感谢 Sweeper 提供详细的答案!


推荐阅读