2016-10-04 1 views
-1

AWSセキュリティ資格情報の特定の形式(YYYYMMD)で現在の日付を印刷しようとしていますが、私が気付いたのはDate()day for DateとCalendar.dateComponentsが一致しません

let date = Date() 
    print("\(date)") //2016-10-04 00:56:28 +0000 

、私は私が望む形式で日付を印刷したいが、私は第三として、日の値を取得しておく::正しい値である第四がある

let calendar = Calendar.current 
    let date = Date() 
    let components = calendar.dateComponents([.day], from: date) 
    print("\(components.day)") //Optional(3) 

S3 4日目になると予想しています。これをどうすれば解決できますか?

+2

によって返された値と一致します:あなたはUTCに日数が必要な場合はちょうどあなたがそれを作成した後、UTCにカレンダーオブジェクトのタイムゾーンを設定あなたの開発用電話機は?あなたのタイムゾーンでは、実際の日付は真夜中前の3日目ですが、UTCで表示すると4日目と表示されます。 –

答えて

1

タイムゾーンの違いによるものです。 dateはUTCの時刻と日付を返しますが、calendarはデバイスのタイムゾーンに基づいて日付と時刻を返します。

let calendar = Calendar.current 
calendar.timeZone = TimeZone(abbreviation: "UTC")! 

それは常にゾーンがある何時間Date()

+0

新しいグレゴリオ暦を作成し、そのカレンダーのタイムゾーンをUTCに設定する方がよいかもしれませんが。現在のカレンダーのタイムゾーンを変更しないと、残りのアプリでカレンダー操作が混乱する可能性がありますか? –

+0

@DuncanCこの 'calendar'オブジェクトのタイムゾーンのみを変更します。 'current'カレンダーは変更されません。 –

+0

しかし、はい、新しいグレゴリオ暦を作成すると、すべてのロケールで安全になります。 –

1

あなたは

print("\(date)") 

を使用して日付を印刷するときあなたが望むものはおそらくないUTC、日付と時刻を取得します。

あなたは、ローカルタイムゾーンにあなたの日付を表示する日付フォーマッタを作成し、その使用したい場合:あなたはこの多くを行う場合は

let dateFormatter = NSdateFormatter() 
let dateFormatter.dateStyle = .medium 
let dateFormatter.timeStyle = .medium 

let dateString = dateFormatter.StringFromDate(date) 
print ("date = \(dateString)") 

は、あなたがそうNSDateのDisplayStringの拡張を作成することができます追加のコードを書くことなく日付を表示することができます。

+0

だから、Herokuは、私がアプリケーションにマッチさせる必要があるUTCの日付で署名入りのリクエストを作成します。 – Brosef

+0

グレゴリオ暦を作成し、タイムゾーンをUTCに設定します。 Sam_Mの答えは、カレンダーのタイムゾーンを設定する方法を示していますが、現在のカレンダーを変更するのではなく、新しいカレンダーを作成することをお勧めします。 –

関連する問題