簡體   English   中英

Swift - 從ISO8601日期字符串中檢索時區

[英]Swift - Retrieve timezone from ISO8601 date string

我以這種格式將日期保存在數據庫中 - “yyyy-MM-dd'T'HH:mm:ssZ”。 例如,“2018-05-17T11:15:00 + 0330”。 時區不同,它在任何用戶的本地時區。

我想檢索並顯示日期,如“2018年11月17日上午11點15分”,將日期/時間保存在與保存時相同的時區。 我怎樣才能做到這一點?

我試過這個。

let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//formatter.timeZone = ???
print(formatter.date(from: dateString))

但我在本地時區獲取Date對象並將其轉換為日期字符串也會在我的本地時區顯示日期。

在Swift中有這樣的東西, https ://stackoverflow.com/a/46216251/1373592嗎?

謝謝。

你真正想做的是忽略時區。

您可以從日期字符串中刪除最后5個字符,以一種格式解析它,並以另一種格式對其進行格式化:

let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
let date = formatter.date(from: String(dateString.dropLast(5)))! // note the stripping off here
formatter.dateFormat = "MMMM d, yyyy hh.mma"
print(formatter.string(from: date))

請注意,您無法將此日期與其他日期進行比較,因為您已將其時區刪除。

此外, SwiftDate是一個類似於JodaTime的庫。

這是我剛剛掀起的TimeZone的一個小擴展。 您可以使用它從ISO8601日期字符串創建TimeZone 它將以下列格式處理字符串中的時區:

  • Z(UTC時間)
  • +/- HH
  • +/- HHMM
  • +/- HH:MM

這是擴展名:

extension TimeZone {
    init?(iso8601: String) {
        let tz = iso8601.dropFirst(19) // remove yyyy-MM-ddTHH:mm:ss part
        if tz == "Z" {
            self.init(secondsFromGMT: 0)
        } else if tz.count == 3 { // assume +/-HH
            if let hour = Int(tz) {
                self.init(secondsFromGMT: hour * 3600)
                return
            }
        } else if tz.count == 5 { // assume +/-HHMM
            if let hour = Int(tz.dropLast(2)), let min = Int(tz.dropFirst(3)) {
                self.init(secondsFromGMT: (hour * 60 + min) * 60)
                return
            }
        } else if tz.count == 6 { // assime +/-HH:MM
            let parts = tz.components(separatedBy: ":")
            if parts.count == 2 {
                if let hour = Int(parts[0]), let min = Int(parts[1]) {
                    self.init(secondsFromGMT: (hour * 60 + min) * 60)
                    return
                }
            }
        }

        return nil
    }
}

並測試:

print(TimeZone(iso8601: "2018-05-17T11:15:00+0330"))

您可以將此解析和格式組合在一起,以便最終結果位於原始時區中。

let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
formatter.locale = Locale(identifier: "en_US_POSIX")
if let date = formatter.date(from: dateString), let tz = TimeZone(iso8601: dateString) {
    let newFmt = DateFormatter()
    newFmt.dateStyle = .medium
    newFmt.timeStyle = .short
    newFmt.timeZone = tz
    let newString = newFmt.string(from: date)
    print(newString)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM