2017-08-12 13 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に設定されている間:異なる時間帯で異なる時間が解釈されるのはなぜですか?

NY時間:2017年8月13日午前1時10分00秒0000 21:10

CHI時間:2017 -08-13夜12時10分00秒0000 20:10

GMT時間:2017年8月13日五時10分00秒0000午前1時10 AM


出力私のシステムはCDTに設定されている間:

NY時間:2017年8月13日午前1時10分00秒0000 20:10

CHI時間:2017年8月13日00: 10時00 0000 19:10

GMT時間:2017年8月13日午前5時10分00秒0000 0:10


は、これらの時間はどんな同じままないべきではありません私がいるタイムゾーン? TimeZone.currentに関連するものは使用していません。

注:TimeZone.secondsFromGMT:を使用する方が良いことがわかりますが、abbreviationパラメータを使用すると、この問題で起こっていることを読みやすくなります。

+3

あなたのコードは意味をなさない。ココアの日付オブジェクトは、瞬時にすべての惑星を横切っています。私がこれを書いているように、それはEDTの午後1時頃、そして中央午後12時頃です。なぜ同じ 'Date'オブジェクトが異なる時間帯で同じ時刻を表示するのでしょうか? –

+0

ローカル日付でその日付を表すには、希望のタイムゾーンに設定された日付フォーマッタを使用する必要があります。 –

+0

2つの出力セットの間で唯一異なるのは、 '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 
関連する問題