仅从日期获取时间

问题描述

如何仅从带有 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

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

  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 小时格式,所以你不能混合它们,所以你应该使用“hh:mm a”代替两个 DateTimeFormatter

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...