2011-10-11 8 views
7

私は、特定のフェリー旅行の時刻表を表示するアプリを持っています。NSDateはタイムゾーンから独立していますか?

異なるタイムゾーンに移動した場合、たとえば、4時間遅れて10時間のフェリー旅に午前6時が表示されます。

これは、日付がタイムゾーンに基づいてどのように扱われるかとは関係がありますが、その動作を変更する方法を考えることはできません。現時点で

は、ここで私は日付を取得し、UILabel上に表示しています方法は次のとおりです。あなたの助けを事前に

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"HH:mm"]; 
[self.departureTime setText:[dateFormatter stringFromDate:[self.route objectForKey:@"departureTime"]]]; 
[self.arrivalTime setText:[dateFormatter stringFromDate:[self.route objectForKey:@"arrivalTime"]]]; 
[dateFormatter release]; 

感謝。

+4

NSDate自体は、タイムゾーンとは無関係であることを理解して - それは、UTC(グリニッジ)の時間を表しています。 NSDateFormatterのタイムゾーンを設定して、必要なタイムゾーンの結果を生成する必要があります。 –

+3

@DanielRHicks日付には* no *タイムゾーンがあります。UTCはタイムゾーンであり、日付にはタイムゾーンがないため、* UTCを表しません*。 –

+0

NSDateの時間オフセットは、通常、UTCを基準にした時間オフセットです。また、NSDateオブジェクトがUTCに相対的に設定されていない場合、NSDateFormatterのタイムゾーンを設定することは無意味です。 –

答えて

7

あなたはフェリーがで行われているタイムゾーンを格納し、その時間帯のためにそれをフォーマットする必要があります。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"HH:mm"]; 

NSDate *now = [NSDate date]; 
NSLog(@"now:%@", [dateFormatter stringFromDate:now]); 

NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)];  
[dateFormatter setTimeZone:timeZone]; 
NSLog(@"adjusted for timezone: %@", [dateFormatter stringFromDate:now]); 

出力:Appleの参照によって記載されているように

2011-10-10 20:42:23.781 Craplet[2926:707] now:20:42 
2011-10-10 20:42:23.782 Craplet[2926:707] adjusted for timezone: 16:42 
+0

夏時間の節約を処理する必要があるかもしれません –

0

NSDate値を混同しないでくださいNSLogのようなフォーマットされた出力で。

NSDate、timeIntervalSinceReferenceDateの唯一の原始的な方法、 はNSDateインターフェイス内の他のすべてのメソッドのための基礎を提供する:NSDateはGMT、Appleのドキュメントです。 このメソッドは、絶対参照に関連する時刻値を返します。 日付 - 2001年1月1日の最初の瞬間、GMT。

NSTimeInterval referenceInterval = [[dateFormatter dateFromString:@"1 January 2001 GMT"] timeIntervalSinceReferenceDate]; 
NSLog(@"referenceInterval: %f", referenceInterval); 

NSTimeInterval estInterval = [[dateFormatter dateFromString:@"1 January 2001 EST"] timeIntervalSinceReferenceDate]; 
NSLog(@"estInterval:  %f", estInterval); 

出力:

referenceInterval: 0.000000 
estInterval: 18000.000000 
+0

その文書引用が "NSDate GMTは2001年1月1日のGMTがどのタイムゾーンでも等しく表現できるためです。 –

+0

NSDateの値が他のどのタイムゾーン(GMTを含む)よりも優先して1つのタイムゾーンの内部概念を持っているのを見ることができないため、 "NSDate is GMT"という意味を理解しようとしています。ドキュメントがGMTで参照日付を任意に引用するという事実を除いて、そしておそらく、タイムゾーンが明示的に提供されていなければ、文字列を受け入れるときにNSDateはデフォルトでGMTとして認識されます。 –

+0

もちろん可能です。ブダペスト時間は2001年1月1日02:00に対して0.0です。 –

1

またNSDateComponentsクラスを使用することができます。

あなたはタイムゾーンとは独立した日付を作成する必要がある場合は、することができます対応するカレンダーへの参照を保存する限り、NSDateComponentsオブジェクトとして日付を格納します。

iOSでは、NSDateComponentsオブジェクトにカレンダー、タイムゾーン、および日付オブジェクトを含めることができます。したがって、コンポーネントとともにカレンダーを保存することができます。 NSDateComponentsクラスのdateメソッドを使用して日付にアクセスする場合は、関連付けられているタイムゾーンが最新であることを確認してください。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtTimeZones.html#//apple_ref/doc/uid/20000185-SW1

-1
 NSDate *currentDateTime = datePicker.date; 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"EEE,MM-dd-yyyy HH:mm:ss"]; 
     NSString *dateInStringFormated = [dateFormatter stringFromDate:currentDateTime]; 
     NSLog(@"%@", dateInStringFormated); 
関連する問題