从 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

问题是 - 要使这两个转换正确发生 - 您必须指定适当的时区。

  1. StringDate
  2. DateString

下面是该实现的样子。假设输入是 "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”