我正在使用此擴展將包含日期的字串轉換為 Date() 物件:
extension String {
func toDate() -> Date?{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/YYYY"
let date = dateFormatter.date(from: self)
return date
}
}
結果總是包含一個時間。我很好奇時間是從哪里來的,為什么不是全零?
print("11/12/2021".toDate())
結果是->
2020-12-19 21:00:00 0000
在我運行代碼時,它顯示 21:00:00,那為什么是 21?我相信它與我的時間無關,因為我在不同的時間運行它。
uj5u.com熱心網友回復:
一個Date物體表示地球上任何地方的一個瞬間,與時區無關。
ADateFormatter可以將 a 轉換String為 a Date(或將 a 轉換Date為 a String,但暫時忽略它)。當它將字串轉換為日期時,它可能會假設一天中的時間(如果該時間不包含在字串中)。我相信它假設時間是日期格式化程式時區的午夜(00:00:00)。(順便說一句,午夜是一天的起點,所以午夜是一天的零小時/分鐘/秒。基本上午夜是時間的零。)
因此,當您呼叫String擴展程式將“11/12/2021”轉換為日期時,擴展程式會創建一個DateFormatter默認為設備時區的日期。它在本地時區創建一個假設午夜的日期。
當您列印該日期時,它會以 GMT 顯示。
看起來你的格式字串有問題。你弄錯了年份和月份。我認為您必須在格式化程式中使用錯誤的月份或日期字串。(當我使用它們時,我總是需要查找它們。)
編輯:
您可能需要“MM-dd-yyyy”格式字串
(2 位數的月份、2 位數的月份日期和 4 位數的年份。)
小寫的“m”或“MM”是分鐘。大寫的“Y”表示基于“一年中的一周”的日歷,您可能不想要它。
試試這個代碼:
func toDate() -> Date?{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
let posixLocale = Locale(identifier: "en_US_POSIX")
dateFormatter.locale = posixLocale
let date = dateFormatter.date(from: self)
return date
}
}
并使用它:
let dateString = "12/11/2021"
let date = dateString.toDate()
print(date)
if let date = date {
let convertedDateString = DateFormatter.localizedString(from: date, dateStyle: .medium, timeStyle: .medium)
print(convertedDateString)
} else {
print("Can't convert \(dateString) to a date")
}
這在我的美國語言環境(美國日期格式)中顯示“2021 年 12 月 11 日凌晨 12:00:00”。請注意,由于我使用DateFormatter類方法,因此localizedString(from:dateStyle:timeStyle:)我將午夜視為顯示時間(當您從 DateFormatter 獲得的時間)不指定時間,但以當地時區顯示。)
uj5u.com熱心網友回復:
答案是:
當我們將字串轉換為日期物件時,重要的部分是我們將其轉換為的時區。
例如,如果您想將字串日期轉換為 UTC 時區,則必須將日期的時區設定為 UTC。
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(identifier: "UTC")
所以這就是為什么當我們列印 Date() 物件時,它會從我們的字串日期延遲。
extension String {
func toDate() -> Date?{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "mm-dd-yyyy"
let date = dateFormatter.date(from: self)
return date
}
}
extension Date {
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "mm-dd-yyyy"
return dateFormatter.string(from: self)
}
}
let stringDate = "01-12-2021"
let date = "01-12-2021".toDate()
let convertBack = date?.toString()
print("(\(stringDate)) -> (\(date!)) -> (\(convertBack!))")
結果是:
(01-12-2021) -> (2021-01-11 21:01:00 0000) -> (01-12-2021)
所以最后當我們轉換回 Date 物件時,它將是相同的。因為擴展中的 2 dateFormatter 使用的是默認時區。如果你想指定一個特定的時區,你必須在從和到字串轉換時宣告它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409127.html
標籤:
