1

mysql の日時フィールドを別のタイムゾーンに変換しようとしています。日付オブジェクトを印刷すると変換は正しいように見えますが、日付を文字列として印刷すると時刻が正しくありません。ソースコードと出力は以下です。

ソース:

編集済み - 元の間隔を秒単位と文字列で出力し、タイムゾーンを追加します

interval = [NSNumber numberWithDouble: seconds];
NSLog(@"interval in ms: %@",interval); 
self.dateStamp = [[NSDate alloc] initWithTimeIntervalSince1970:seconds/1000];


if(![currentZone.name isEqualToString: timezone]){          //need to convert
    NSDateFormatter *fromTZ = [[NSDateFormatter alloc]init];
    [fromTZ setTimeZone:currentZone];
    [fromTZ setDateFormat:@"hh:mm yyyy-MM-dd"];
    NSLog(@"original date: %@",[fromTZ stringFromDate:self.dateStamp]);
    NSDateFormatter *toTZ = [[NSDateFormatter alloc]init];
    [toTZ setTimeZone:spotZone];
    [toTZ setDateFormat:@"hh:mm yyyy-MM-dd"];
    NSString *tempdate = [fromTZ stringFromDate:self.dateStamp];
    NSDate *toDate = [toTZ dateFromString:tempdate];
    NSLog(@"Date: %@",toDate);
    NSLog(@"Date String: %@", [toTZ stringFromDate:toDate]);
}

出力:

間隔 (ミリ秒): 1384193573000

元の日付: 01:12 2013-11-11 //現在のタイムゾーンの日付: America/Phoenix

Date: 2013-11-11 08:12:00 +0000 //新しいタイムゾーンの日付: America/New York

日付文字列: 01:12 2013-11-11

4

2 に答える 2

2

NSDateにはタイム ゾーンの概念がなく、2001 年 1 月 1 日 GMT からの秒数を表すオブジェクトであり、UTC で表されます。何を試して設定しても、直接ログに記録するNSDateと、同じ結果が得られます。これを回避する唯一の方法は、NSDateFormatter既に行った を使用することです。あなたが投稿したものはすべて、期待される動作です。

于 2013-11-13T18:37:53.660 に答える
1

サーバー1384193573000は 1.1.1970 以降の時間 (ミリ秒単位) を送信しますが、通常行われているように GMT に関してではなく、別のタイム ゾーン、例では「America/Phoenix」に関して送信します。

したがって、最初に修正を追加する必要があります。これは、「アメリカ/フェニックス」と GMT の違いです。

NSTimeInterval serverTime = 1384193573000/1000.;
NSTimeZone *fromZone = [NSTimeZone timeZoneWithName:@"America/Phoenix"];
NSTimeInterval diff = [fromZone secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:0]];
NSDate *dateStamp = [NSDate dateWithTimeIntervalSince1970:(serverTime - diff)];

これが重要なステップでした。dateStampサーバーから送信された時間を表す「適切な」NSDateオブジェクトになりました。残っているのは、日付を表示することです。これは、上記のコメントと他の回答のように行われます。例えば:

NSTimeZone *toZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
NSDateFormatter *toTZ = [[NSDateFormatter alloc]init];
[toTZ setTimeZone:toZone];
[toTZ setDateFormat:@"HH:mm yyyy-MM-dd"];
NSString *result = [toTZ stringFromDate:dateStamp];

// result = 20:12 2013-11-11
于 2013-11-13T19:16:08.713 に答える