2017-09-20 3 views
0

のいくつかのために壊れているこれは、私が何をすべきかであるとき、ピッカーの変更:DateFormatter.localizedStringは日付

extension Date { 
    var fromCurrentToUTC: Date { 
     return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT())) 
    } 
}  


var title = "--" 

if let date = datePickerView.date?.fromCurrentToUTC { 
    title = DateFormatter.localizedString(from: date, dateStyle: .medium, timeStyle: .none) 
} 

print("-----") 
print(datePickerView.date!) 
print(title) 
print(TimeZone.current) 
print(datePickerView.date!.timeIntervalSince1970) 

dateTimeSegmentControl.setTitle(title, forSegmentAt: 0) 

そして、これはそれが日付のためにどのように見えるかです:

enter image description here enter image description here enter image description here enter image description here

とする。 11月6日以前の日付はすべて正常で、11月6日以降はすべてがオフです。どうして?

更新:

重要な日付は、私が使用して、すべての時間帯の異なるされていること。たとえば:

ワルシャワ(0200)日は10月30日 あるシカゴ(-0500)は、日付が11月6日

注文したプリントです:あなたの関数で

 
----- 
2017-11-04 00:00:00 +0000 
4 Nov 2017 
America/New_York (current) 
1509753600.0 
----- 
2017-11-05 00:00:00 +0000 
5 Nov 2017 
America/New_York (current) 
1509840000.0 
----- 
2017-11-06 00:00:00 +0000 
5 Nov 2017 
America/New_York (current) 
1509926400.0 
----- 
2017-11-07 00:00:00 +0000 
6 Nov 2017 
America/New_York (current) 
1510012800.0 

+1

ほとんどおそらくワルシャワで2017年11月5日にある夏時間(の終わりに2017年10月29日シカゴで)。 –

+0

どうすればよいですか?)これを回避するにはどうしたらいいですか? –

+0

フィンランド(10月29日)のためにうまくいくようです - DateFormatter.localizedStringで間違った日付が表示されない –

答えて

1

extension Date { 
    var fromCurrentToUTC: Date { 
     return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT())) 
    } 
} 

現在の日付のGMTオフセットは、で除外され、 ではなく、GMTオフセットによって減算されます調整する。したがって、調整する日付がDST期間にあり、現在の日付がDST期間でない場合、またはその逆の場合は、 が間違った結果になります。代わり

extension Date { 
    var fromCurrentToUTC: Date { 
     return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT(for: self))) 
    } 
} 

を用いて固定することができる

。しかし、よりよい解決策ではなく、日付を調整する、UTCの日付フォーマッタのタイムゾーン を設定するには、次のようになります。

if let date = datePickerView.date { 
    let fmt = DateFormatter() 
    fmt.dateStyle = .medium 
    fmt.timeStyle = .none 
    fmt.timeZone = TimeZone(secondsFromGMT: 0) 
    let title = fmt.string(from: date) 
    print(title) 
} 
+0

これで動作するはずですか?今すぐ新しいxcodeに問題がありますが、すぐに確認してください –

+0

@BartłomiejSemańczyk:私のテストでは機能しましたが、自分で検証する必要があります。 –

+0

@BartłomiejSemańczyk:より良い解決策は、日付を調整する代わりに、UTCに設定されたタイムゾーンでカスタム日付フォーマッタを使用することです。 –