2017-08-12 73 views
-1
import UIKit 
import Foundation 

let dateString = "2017-08-13T05:10:00Z" 
let dateFormatter = ISO8601DateFormatter() 

if var date = dateFormatter.date(from: dateString) { 
    if let newYorkTimeZone = TimeZone(abbreviation: "EDT") { 
     date.addTimeInterval(TimeInterval(newYorkTimeZone.secondsFromGMT(for: date))) 
     print("NY time:", date, date.hour()) 
    } 
} 

if var date = dateFormatter.date(from: dateString) { 
    if let chiTimeZone = TimeZone(abbreviation: "CDT") { 
     date.addTimeInterval(TimeInterval(chiTimeZone.secondsFromGMT(for: date))) 
     print("CHI time:", date, date.hour()) 
    } 
} 

if let gmt = TimeZone(abbreviation: "GMT") { 
    if var date = dateFormatter.date(from: dateString) { 
     print("GMT time:", date, date.hour()) 
    } 
} 

extension Date { 
    func hour() -> String { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "h:mm a" 

     return dateFormatter.string(from: self) 
    } 
} 

輸出,而我的系統設置爲EDT:爲什麼時間在不同的時區有不同的解釋?

紐約時間:2017年8月13日1時10分零零秒+0000 9:10 PM

CHI時間:2017年-08-13 00:10:00 +0000下午8:10

GMT時間:2017年8月13日五點10分00秒+0000上午01時10


輸出,而我的系統設置爲CDT:

紐約時間:2017年8月13日1時10分〇〇秒+0000下午8:10

CHI時間:2017年8月13日00: 10:00 +0000 7:10 PM

GMT時間:2017年8月13日5點10分00秒+0000凌晨00:10


不宜這些時間保持不變,無論什麼我在哪個時區?我沒有使用與TimeZone.current相關的任何內容。

注:我知道最好使用TimeZone.secondsFromGMT:,但使用縮寫參數可以更容易地閱讀本問題中發生的情況。

+3

你的代碼沒有意義。可可日期對象是整個地球上的瞬間。我寫這篇文章的時間是美國東部時間下午1點左右,中央時間下午12點左右。爲什麼同一個「Date」對象在不同時區顯示爲同一時間? –

+0

您應該使用設置爲所需時區的日期格式化程序在當地時間表示該日期。 –

+0

您的兩組輸出之間唯一不同的是調用'hour'和'hour'函數的結果是基於您當前的語言環境和當前時區。所以當你改變系統的時區時,這些值當然會改變。 – rmaddy

回答

0

這裏是我的版本的代碼從一個操場。

import UIKit 

let dateString = "2017-08-13T05:10:00Z" 
let isoDateFormatter = ISO8601DateFormatter() 
guard let date = isoDateFormatter.date(from: dateString) else { assert(false) } 

let gmtDateFormatter = DateFormatter() 
gmtDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)! 
gmtDateFormatter.dateStyle = .medium 
gmtDateFormatter.timeStyle = .medium 

let nyDateFormatter = DateFormatter() 
nyDateFormatter.timeZone = TimeZone(abbreviation: "EDT")! 
nyDateFormatter.dateStyle = .medium 
nyDateFormatter.timeStyle = .medium 

let chiDateFormatter = DateFormatter() 
chiDateFormatter.timeZone = TimeZone(abbreviation: "CDT")! 
chiDateFormatter.dateStyle = .medium 
chiDateFormatter.timeStyle = .medium 

let gmtDate = gmtDateFormatter.string(from: date) // -> Aug 13, 2017, 5:10:00 AM 
let nyDate = nyDateFormatter.string(from: date) // -> Aug 13, 2017, 1:10:00 AM 
let chiDate = chiDateFormatter.string(from: date) // -> Aug 13, 2017, 12:10:00 AM 

一個日期是在固定時間點,它沒有時區,或夏時制。要獲得字符串表示,請使用帶有應用時區的DateFormatter。我的遊樂場設置爲默認的美國語言環境,但我可以更改任何日期格式化程序的語言環境以不同方式顯示日期和時間。

你不需要爲你有的日期添加間隔,你只需要格式化它的輸出,這是一個DateFormatter的用途。

+0

好的我明白了。我應該改變日期呈現方式'DateFormatter',而不是試圖改變'Date'本身。 – erdos

0

考慮以下代碼:在EDT

let now = Date() 

let formatter = DateFormatter() 
formatter.dateStyle = .medium 
formatter.timeStyle = .medium 

func printDate(_ aDate: Date, inTimeZone timeZoneString: String? = nil) { 
    let timeZone: TimeZone! 
    if let timeZoneString = timeZoneString { 
    timeZone = TimeZone(abbreviation: timeZoneString) 
    guard timeZone != nil else { 
     print("invalid time zone string \(timeZoneString)") 
     return 
    } 
    } else { 
    timeZone = TimeZone.current 
    } 
    formatter.timeZone = timeZone 
    print("Date = \(formatter.string(from: now)) in time zone \(timeZone.abbreviation()!)") 
} 

printDate(now) 
printDate(now, inTimeZone: "CDT") 
printDate(now, inTimeZone: "GMT") 
printDate(now, inTimeZone: "NZST") 

運行:輸出:

Date = Aug 12, 2017, 1:17:13 PM in time zone EDT 
Date = Aug 12, 2017, 12:17:13 PM in time zone CDT 
Date = Aug 12, 2017, 5:17:13 PM in time zone GMT 
Date = Aug 13, 2017, 5:17:13 AM in time zone GMT+12 
相關問題