从 Date 获取唯一的时间
Get only time from Date
如何从 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
格式化后得到错误的时间return。请指导上面代码有什么问题
正如 @JoakimDanielson 在评论中提到的,您将 HH
(24 小时格式)与 hh
(12 小时格式)混合使用。对 dateFormatter
使用 hh
(假定您的输入有 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 小时格式,因此您不能混合使用它们,因此您应该对 DateTimeFormatter 的
使用“hh:mm a”
如何从 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
格式化后得到错误的时间return。请指导上面代码有什么问题
正如 @JoakimDanielson 在评论中提到的,您将 HH
(24 小时格式)与 hh
(12 小时格式)混合使用。对 dateFormatter
使用 hh
(假定您的输入有 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 小时格式,因此您不能混合使用它们,因此您应该对 DateTimeFormatter 的
使用“hh:mm a”