2012-03-01 6 views
1

うるう年、[NSDate date]2012-03-01 HH:MM:SS +TTTTを返します。[NSDate date]とうるう年の問題

私はよく今日、[NSDate date]を呼び出すだけで今日の日付が取得された投稿を見てきました。問題は、うるう年には、これが正しい日付を返さないということです。今私はうるう年が実際にはカレンダーシステムの関数であることを理解しているので、NSDateはうるう年(またはその夏時間)を認識しません。あなたが時に見て比較を行うその後

// assume today's date is 2012-02-29 10:00:00 +0000 
NSDate *fileModificationDate = [NSDate date]; // 2012-03-01 10:00:00 +0000 is returned 

を将来のある時点で:

はあなたが実行して、ファイルの更新日時を割り当てる言う:例えば - しかし、これはコードで大混乱を台無しにする可能性を秘めていますファイルが最後に変更されました:

// assume it's the next day at 9 AM, ie 2012-03-01 09:00 +0000 
NSTimeInterval timeSinceLastModification = [fileModificationDate timeIntervalSinceNow]; 

返さtimeSinceLasModificationは意味をなさない将来の時間を意味する、ポジティブになります!

私の質問は、実際には[NSDate date]を使用して現在の日付を取得するのは悪い習慣ですか?私はここで何か重要なものを逃しています長いったらしい質問して申し訳ありません

...

+0

No-repro。 'NSLog'を介して' [NSDate date] 'を印刷すると、1日中2/29が表示されます。あなたのタイムゾーンは何ですか?どのように日付を表​​示していますか? –

答えて

8

あなたはNSDateはうるう日サポートしていないという考えを持ってどこかはわからないが、それは絶対に間違っているのです。私は今あなたがGMTで、混乱していると信じています。日付文字列は2012-03-01 03:42:07 +0000です。これはです。です。 GMTでは、すでに3月1日です。現在のロケール(たとえば[[NSDate date] descriptionWithLocale:[NSLocale currentLocale]])の日付を尋ねると、うるう年の正しい値が得られます。私にとってはPSTに、それは

2012年2月29日(水曜日)午前7時42分46秒PM(太平洋標準時)

NSDate自体は、ロケール非対応であることに注意してくださいです。私が行った唯一の変更は、GMTを使用するのではなく、現在のロケールを使用して文字列表現を返すように要求することでした。私は同じ日付のオブジェクトを取ってESTを求めて、それが私にそのタイムゾーンの正しい文字列を与えるでしょう。

+0

うわー...私はそれを拾っていないために絶対にばかげていると感じる!答えをありがとうKevin、あなたは完全に正しいです! NSDateは実際に夏時間などの事柄を実際に説明しているのですか... ...私はそれについて何も読んでいないと誓っている可能性があります。 –

+1

技術的に/厳密に/ pedanticallyですが(私はこれがあなたのポイントを補強すると信じています) 'NSDate' _doesn't_"カレンダー/ロケールの機能です。 'NSDate'はちょうどある時点です。ラベルや説明文を提供するのは、カレンダーシステムに任されています。 –

+0

@JoshCaswell Kevinが言っていたことは、私たちがGMT時代にPSTに入って以来、実際には3月1日だったと思う - それが一日早く、 'NSDate date 'と呼んでいたら2月29日時間。 –

関連する問題