ios - 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 点。所以... ??
解决方案
答案是我的格式关闭了。它应该是 h:mm,而不是 HH:mm。感谢 Sweeper 提供详细的答案!
推荐阅读
- javascript - 如果被布尔以外的东西触发
- python - 在同一行插入多个数字(Python)
- python - Python Pandas:如何排除任何值重复超过 n 次的行
- serialization - 将 KryoSerializer 注册到 Hazelcast
- mysql - 我需要将代码从 flask_sqlalchemy ORM 转换为原始 SQL
- html - 是否可以将图像或视频从 Safari 下载到 iOS 13 中的相机胶卷?
- leaflet - 传单 - 是否可以将坐标与图像中的设定点居中
- php - PHP 7.1+ 中的 PHP Shuffle 产生不同的结果
- flutter - 在 ontap 函数中添加 materialRoute
- python - 如何在 matplotlib 中删除 Axes3D 图形上的比例/轴?