0

私は検索しましたが、私のような正確な質問が見つからなかったので、ここには何もありません:

XML フィードから取得したキーを含む NSString があります。キーは 24 時間形式の時刻です (例: 13:30 または 15:00)。NSString を NSDate に変換し、デバイスの設定タイムゾーンに基づいて適切なタイムゾーンに変換したいと考えています。キーは Unicode HH:mm (24:00) なので、これが正常に機能しない理由が気になります。

機能するはずの基本的なアウトラインを既に取得していますが、残念ながら機能しません。2 番目の NSLog (Got NS Date) は null を返し、最後のログは奇妙な数字 (正確には 1969-12--2147483629 -596:-31:-23 +0000) を返します。

前もって感謝します、

    NSString *dateString = [dict objectForKey:@"24hrdate"];
    NSLog(@"NSString Date: %@", dateString);

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
    [formatter setDateFormat:@"HH:mm"];
    NSDate *sourceDate = [formatter dateFromString:dateString]; 
    NSLog(@"Got NS Date: %@", sourceDate);

    NSTimeZone *sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];

    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];
    NSLog(@"Final Date: %@", destinationDate);
4

3 に答える 3

0

NSDate日付と時刻を表すために使用されます。真夜中を守ることで日付だけを表現することはできますが、実際には時刻だけを表現することはできません。Macではこれを偽造することができますが(デフォルトでは妥当な日が設定されています)、iOSでは代わりに非常に不正確な時間が発生します。(少なくとも、特定のバージョンで実行します。これは修正されている可能性があります。)

ここには2つのアプローチがあります。

  1. 時刻からを作成し、それNSDateComponentsを使用dateByAddingComponentsして、時刻を表示する日付の深夜に追加することができます。これにより、夏時間が開始または終了する日に期待する時間を返すことができなくなります。

  2. NSDate必要な日付( )と時刻(おそらくは)を使用して、日付/時刻の文字列を作成できますNSString

- (NSDate *)timeInHours: (NSInteger)hours
                minutes: (NSInteger)minutes
                seconds: (NSInteger)seconds
                 onDate: (NSDate *)inDate;
{
    id timeStr = [[NSMutableString alloc] initWithFormat: @"%02d:%02d:%02d", hours, minutes, seconds];
    id dateStr = [dateWithoutTimeFormatter stringFromDate: inDate];
    id dateTimeStr = [[NSString alloc] initWithFormat: @"%@ %@", dateStr, timeStr];
    [timeStr release];
    id dateTime = [dateWithTimeFormatter dateFromString: dateTimeStr];
    [dateTimeStr release];
    return dateTime;
}

本当に時刻だけが必要な場合は、文字列として保持してください。

于 2011-06-29T06:39:04.130 に答える
0

まず、日付コンポーネントが01-01-1970提供されていないためであることを理解してください。04:00 GMT入力文字列が@"04:00". フォーマッタのタイムゾーンを設定することで実現できます。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[formatter setDateFormat:@"HH:mm"];
NSDate *sourceDate = [formatter dateFromString:dateString]; 
于 2011-06-29T06:35:55.643 に答える
0

最初に設定したことを問題なく達成できたことを投稿したかっただけです。基本的に、文字列を NSDate に変換し、その NSDate を NSDateFormatter (時刻の元のタイムゾーンに設定 - NSDateFormatter の setTimeZone が役に立ちました) を介して実行し、そこから NSDate を取り出してから、デバイスのタイムゾーンの別の NSDateFormatter を介してそれを実行する必要がありました。 . 次に、結果の NSDate を NSString に変換し、UILabel に貼り付けました。

デバイスをさまざまなタイムゾーンに設定しましたが、タイムゾーンの変更はまだ正しいため、このソリューションは非常にうまく機能しているようです。

編集:これも含めることが重要でした:

NSString *date…….
date = [date stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
于 2011-06-30T07:31:50.740 に答える