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 你确定你读得够仔细吗?它清楚地告诉您HH
和h
之间的区别。在这种情况下,您显然应该使用后者。
你是 100% 正确的!非常感谢!
【参考方案1】:
答案是我的格式已关闭。它应该是 h:mm,而不是 HH:mm。感谢 Sweeper 的详细解答!
【讨论】:
以上是关于Swift DateFormatter 错误地转换字符串日期/时间的主要内容,如果未能解决你的问题,请参考以下文章
在swift中使用DateFormatter时发生错误[重复]