2011-09-20 6 views
14

私はNSDateオブジェクトを持っています。のは、それが「2011年1月10日」NSDateからNSDateをタイムゾーンで調整する

NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"]; 

その日は私のためにタイムゾーンの「2011年9月30日夜10時00分00秒」に変換を表すとしましょう。

質問:ローカルタイムゾーンで「2011-10-01 00:00:00」を表す新しいDateオブジェクトを取得するにはどうすればよいですか?

+0

try \t [df setLocale:[NSLocale currentLocale]]; –

答えて

27

NSDateだけ時間で絶対点を表す日付フォーマッタオブジェクトを使用する必要があります。タイムゾーンやカレンダーの概念はありません。 NSDateインスタンスを作成すると、2001年1月1日のGMTからの秒数にすぎません!あなたがニューヨーク、東京、バルセロナ、エルサレムにいるかどうかは関係ありません。

あなたの例では、GMTに基づいてNSDateをインスタンス化しますが、[date description]NSLogで使用されます)は現地時間に変換します。そこに不一致があります。

はそう考えるために、2つの部分があります。

(ヘブライ語でグレゴリオ暦で2012が、5772)NSCalendarとNSTimeZone

あなたは手動でカレンダーを指定する必要があり、日付を作成している場合

を使用して1 NSDateの作成(22PMロンドン時間ですが、シドニー時間は午前7時です)。

// Use the user's current calendar and time zone 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
[calendar setTimeZone: [NSTimeZone systemTimeZone]]; 

// Specify the date components manually (year, month, day, hour, minutes, etc.) 
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init]; 
[timeZoneComps setHour:22]; 
[timeZoneComps setMinute:0]; 
[timeZoneComps setSecond:0]; 
// ... year, month, ... 

// transform the date compoments into a date, based on current calendar settings 
NSDate *date = [calendar dateFromComponents:timeZoneComps]; 

この時点で、現在のカレンダーを表す正確な時点(秒)が保存されます。あなたは、文字列に日付を変換するために使用されるNSDateFormatterを、必要とするあなたのNSDateの制御出力についてNSDateFormatter

を使用して

2. NSDate出力。

アップルNSDateFormatter Class Referenceドキュメント

に基づいてあなたが奨励されているあなたは フォーマッタを取得し、スタイルの日付に設定することができます多くの属性、... がありますが、しかし、は、個々の設定を変更しない 。代わりにあなたがsetDateStyle :, setTimeStyleを使用してフォーマットを指定して初期化時に確立されたデフォルトの設定を受け入れ、必要があります。

これは、すべてのロケールの異なる出力、のために特別に重要です。デフォルトでは、NSDateFormatterは現在のユーザーのロケール設定を監視します。だから同じNSDateは、同じ入力と同じコードに対して22.11.2011 18:33:19Nov 22, 2011 6:33:19 PM、または2011-11-22 下午6:33:19、さらには२२-११-२०११ ६:३३:१९ अपराह्となる可能性があります。

とコード:

// NSDate *date -> NSString *dateString 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

// Medium style date, short style time => "Nov 23, 1937 3:30pm" 
NSString *dateString = [dateFormatter stringFromDate:date]; 

それとも、クラスメソッド私はこの問題を明確に願っていますlocalizedStringFromDate:dateStyle:timeStyle:

を使用して、それを変換することができます。

6

[NSDate date]はGMTで日付を返します。

するときは、状態:

日があるため、私の タイムゾーンの「2011年9月30日夜09時00分00秒」に変換こと。

NSLogまたはNSDateFormatterですか? NSLogが使用する[date description]に頼らず、ローカルタイムゾーンを考慮に入れて、NSDateFormatterを使用してください。 NSDateFormatterは、方法がsetTimeZoneである。 [date description]上のアップルのドキュメントから

表現は、オペレーティング・システムの 異なるリリース間で一定に維持することが保証されていません。日付の書式を設定するには、 代わり