微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅从日期获取时间

如何解决仅从日期获取时间

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。