2017-06-20 10 views
0

私はTimeZoneを迅速に使用していくつかの問題を抱えています。TimeZone Issue swift3

func date(hour: Int, minute: Int, timeZone: TimeZone) -> Date { 
    let components = DateComponents(calendar: Calendar.current, timeZone: timeZone, era: nil, year: nil, month: nil, day: nil, hour: hour, minute: minute, second: 0, nanosecond: 0, weekday: nil, weekdayOrdinal: nil, quarter: nil, weekOfMonth: nil, weekOfYear: nil, yearForWeekOfYear: nil) 
    return components.date! 
} 

var startDate_TimeZone = TimeZone.init(identifier:"Asia/Seoul") 
var endDate_TimeZone = TimeZone.current 

let startDate = date(hour: 13, minute: 00, timeZone: startDate_TimeZone!) 
// Returns "Jan 1, 1, 7:02 AM" 

let endDate = date(hour: 13, minute: 00, timeZone: endDate_TimeZone) 
// Returns "Jan 1, 1, 1:00 PM" 

なぜそれは私がタイムゾーンを初期化する際に2分を追加することで、時間を返すのですか?これを避ける方法は?

さまざまなタイムゾーンで発生しています。 &ドキュメントでこれについて何も見つかりませんでした。

ありがとうございます!

+2

計算の目的は何ですか?なぜ0001年の日付を計算するのですか? –

答えて

0

あなたが見たように、1年目の日付を使用しているため、2分のオフセットです.iOS(ほとんどのコンピューティングプラットフォーム)では、IANA time zone databaseで定義されています。あなたがしているものと一致

# Zone NAME   GMTOFF RULES FORMAT [UNTIL] 
Zone Asia/Seoul  8:27:52 -  LMT  1908 Apr 1 

、1908年4月1日より前である、オフセットGMTは午前八時27分52秒で、:時間の年1のゾーンが、アジア/ソウルのエントリがこれを含んではありませんでした見て。 (私は歴史に精通していないので、なぜこれが相殺されているのかわからない - 私はソウルのタイムゾーン前の世界で推測している)。

あなたの日付が年を指定していないので、あなたが代わりに現在の年の年間1を取得している:

let startDate = date(hour: 13, minute: 00, timeZone: startDate_TimeZone!) 

をあなたがしたいことは、今年13時○○分今日ある場合は、のような何かをこの:それはあなたが望むものではない場合

let now = Date() 
let now1pm = Calendar.current.date(bySettingHour: 13, minute: 0, second: 0, of: now) 

、さらに説明したり、他の有用な方法のためにCalendarをご覧ください。

0

コメントでマーティンが指摘したように、0001年のタイムゾーンを計算しています。タイムゾーンなどのデータがないため、これまでのタイムゾーンデータはありません。

有効な日付参照のないタイムゾーンは無意味です。現代であっても、夏時間などのために、年間のさまざまな部分で異なる結果を得ることができます。

変換で有効な日付を指定すると、正しく動作するはずです。