如何解决仅从日期获取时间
如何仅从带有 am/pm 的日期中获取时间。以下是我迄今为止尝试过的代码:
func changeFormat(str:String) -> String {
let dateFormatter = DateFormatter()
let newDateFormatter = DateFormatter()
// step 1
dateFormatter.dateFormat = "MM/dd/yyyy HH:mm aa" // input format
newDateFormatter.dateFormat = "HH:mm aa" // output format
let date = dateFormatter.date(from: str)!
// step 2
let string = newDateFormatter.string(from: date)
return string
}
用法:
let strTimeFromDate = changeFormat(str: self.response?.Data[indexPath.row].ADateTime ?? "")
输入日期:
06/22/2021 2:00 PM
输出:
12:45 PM
解决方法
正如 @JoakimDanielson 在评论中提到的,您将 HH
(24 小时格式)与 hh
(12 小时格式)混合在一起。将 hh
用于 dateFormatter
(假设您的输入具有 02:00 PM
)应该可以解决您的问题(只要此输入值是在您打算使用的同一时区捕获的转换).
如果您仍然看到输出不是预期的,则是输入中缺少 timeZone
信息的问题。您正在尝试在未指定输入时区和输出时区的情况下转换 String > Date > String
。您可以尝试在您的实现中打印这些值。
print("dateFormatter.timeZone.secondsFromGMT() : \(dateFormatter.timeZone.secondsFromGMT())")
let date = dateFormatter.date(from: str)!
print("parsed date : \(date)")
print("\n ------------------------ \n")
// step 2
print("newDateFormatter.timeZone.secondsFromGMT() : \(newDateFormatter.timeZone.secondsFromGMT())")
let string = newDateFormatter.string(from: date)
print("parsed string : \(string)")
对我来说,它会打印以下内容。 19800 / (60 * 60) = 5.5 (+05:30)
dateFormatter.timeZone.secondsFromGMT() : 19800
parsed date : 2021-06-22 06:30:00 +0000
------------------------
newDateFormatter.timeZone.secondsFromGMT() : 19800
parsed string : 12:00 PM
问题是 - 要使这两个转换正确发生 - 您必须指定适当的时区。
-
String
到Date
-
Date
到String
这是该实现的样子。假设输入是 "06/22/2021 2:00 PM +0530"
func changeFormat(str: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: Int(5.5*60*60)) // +05:30
let newDateFormatter = DateFormatter()
newDateFormatter.timeZone = TimeZone(secondsFromGMT: Int(5.5*60*60)) // +05:30
dateFormatter.dateFormat = "MM/dd/yyyy hh:mm aa Z"
newDateFormatter.dateFormat = "hh:mm aa"
let date = dateFormatter.date(from: str)!
let string = newDateFormatter.string(from: date)
return string
}
当您从后端服务器使用此日期字符串时,您应该考虑为其使用适当的时区。一个例子,假设输入是 "06/22/2021 2:00 PM +0000"
-
func changeFormat(str: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) // Server timeZone (UTC)
let newDateFormatter = DateFormatter()
newDateFormatter.timeZone = TimeZone.current // User's timeZone
dateFormatter.dateFormat = "MM/dd/yyyy hh:mm aa Z"
newDateFormatter.dateFormat = "hh:mm aa"
let date = dateFormatter.date(from: str)!
let string = newDateFormatter.string(from: date)
return string
}
,
“HH”是 24 小时格式,“aa”是 12 小时格式,所以你不能混合它们,所以你应该使用“hh:mm a”代替两个 DateTimeFormatter
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。