我的要求是將從我的 API 接收到的日期字串(在 PHT 中)轉換為另一種日期字串格式。
- API 日期字串格式:“MM/dd/yyyy HH:mma” 例如。“2022 年 6 月 28 日下午 6:55”
- UI 日期字串格式:“dd MMM yyyy, hh:mm a”,例如。“2022 年 6 月 28 日,下午 6:55”
我寫了以下代碼:
extension Date {
func toString(format: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
return formatter.string(from: self)
}
init?(from: String) {
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy HH:mma"
guard let date = formatter.date(from: from) else { return nil }
self = date
}
}
let dateFormat = "dd MMM yyyy, hh:mm a"
var dateStr = "06/28/2022 06:55PM"
let date = Date(from: dateStr)
date?.toString(format: dateFormat)
但是,時間不正確。我得到“2022 年 6 月 28 日,下午 12:55”作為輸出。我也嘗試添加語言環境和時區。似乎沒有任何幫助。任何幫助將非常感激。
編輯:我為編譯問題道歉。最后我編輯了幾個變數名以使其更具可讀性,錯誤地洗掉了幾個方法呼叫。我已經修復并更新了直接粘貼到 Playground 檔案時要運行的代碼。
@Larme:謝謝你的回答。有效!您能否將其作為單獨的答案發布,以便我接受。
uj5u.com熱心網友回復:
正如@Larne 要求從 "MM/dd/yyyy HH:mma" 更改為 "MM/dd/yyyy hh:mma" 并臨時修改錯誤代碼,如下所示
extension Date {
func toString(format: String) -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
return formatter.string(from: self)
}
init?(from: String) {
let formatter = DateFormatter()
formatter.dateFormat = "MM/dd/yyyy hh:mma"
guard let date = formatter.date(from: from) else { return nil }
self = date
}
}
let dateFormat = "dd MMM yyyy, hh:mm a"
let dateStr = "06/28/2022 06:55PM"
let date = Date(from: dateStr)
let finalDate = date?.toString(format: dateFormat)
print("FinalDate",finalDate)
uj5u.com熱心網友回復:
就個人而言,我使用這個庫SwiftDate處理與 Swift 中的日期相關的所有事情。這太棒了。我給你舉個例子來說明這種事情是多么簡單。
import SwiftDate
func workingWithDate() {
let inputFormat = "MM/dd/yyyy hh:mma"
let outputFormat = "dd MMM yyyy, hh:mma"
let dateStr = "06/28/2022 06:55PM"
guard let dateFromString = dateStr.toDate(inputFormat, region: Region.ISO) else { return }
print(dateFromString)
print("Output date: \(dateFromString.toFormat(outputFormat, locale: nil))")
}
輸出是:
{abs_date='2022-06-28T18:55:00Z', rep_date='2022-06-28T18:55:00Z',
region={calendar='gregorian', timezone='GMT', locale='en_US_POSIX'}
Output date: 28 Jun 2022, 06:55PM
要了解的主要內容是您嘗試決議的字串是 ISO 格式,因為它不包含任何區域資訊,因此如果您嘗試使用 UTC/GMT 等決議它,我認為您不會得到正確的值。例如,如果您使用 UTC 決議而不包括 AM/PM 它可以作業,但如果您在輸入格式中包含“a”并且在日期字串中包含 AM 或 PM,它將無法決議它。
uj5u.com熱心網友回復:
首先:您的時間轉換問題是由于在輸入格式中使用HH而不是hh引起的。
然后我建議永遠不要像在擴展中那樣在函式呼叫中實體化 DateFormatter,因為這是一個相對昂貴的操作。
創建一次時間格式化程式并重復使用它們:
import Foundation
let inputDateFormatter = DateFormatter()
inputDateFormatter.dateFormat = "MM/dd/yyyy hh:mma" // Note LOWERCASE hh
// uncomment the following line if you'd like to display the time in the user's time zone
// inputDateFormatter.timeZone = TimeZone(abbreviation: "PHT")
let outputDateFormatter = DateFormatter()
outputDateFormatter.dateFormat = "dd MMM yyyy, hh:mm a"
let dateStr = "06/28/2022 06:55PM"
if let date = inputDateFormatter.date(from: dateStr) {
let output = outputDateFormatter.string(from: date)
}
如果沒有適當的范圍,在這樣一個通用名稱下使用特定功能擴展 Date 也會很快導致應用程式中其他地方的有趣行為。
另請記住,如果您沒有在輸入中設定時區,那么您假設字串顯示在與 API 服務相同的時區。因此,如果您的用戶不在 PHT 中,時間顯示將關閉(它會顯示 PHT 時間,盡管用戶在其他地方)。
希望能幫助到你!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496742.html
