Swift DateFormatter 错误地转换字符串日期/时间

Posted

技术标签:

【中文标题】Swift DateFormatter 错误地转换字符串日期/时间【英文标题】:Swift DateFormatter converting string day/times incorrectly 【发布时间】:2021-08-11 01:10:20 【问题描述】:

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

周日 11:00a PDT

周日 7:00p PDT

太平洋夏令时间周一 11:00a

太平洋夏令时间周一晚上 7:00

太平洋夏令时间周二 11:00a

太平洋夏令时间周二晚上 7:00

星期三 10:00a PDT

星期三 7:00p PDT

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

虽然 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:00a)

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

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

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

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

2000-01-05 19:00:00 +0000(太平洋夏令时间周三晚上 7:00)

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:00)

特别是,为什么星期六要转换为 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 点。所以……??

【问题讨论】:

'E HH:mmaaaaa zzz'的日期时间格式从何而来? 此 Unicode 标准:unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns 你确定你读得够仔细吗?它清楚地告诉您HHh 之间的区别。在这种情况下,您显然应该使用后者。 你是 100% 正确的!非常感谢! 【参考方案1】:

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

【讨论】:

以上是关于Swift DateFormatter 错误地转换字符串日期/时间的主要内容,如果未能解决你的问题,请参考以下文章

DateFormatter 不转换特定日期 (Swift)

在swift中使用DateFormatter时发生错误[重复]

Swift DateFormatter 不会根据预设的 Dateformat 转换日期

swift DateFormatter

swift DateFormatter

swift DateFormatter