2011-12-20 20 views
3

JSON文字列(/ Date(1324435876019-0000)/)を作成するために、ローカル日付([NSDate date])をGMTに変換します。NSDate to JSON形式

私のタイムゾーンをPSTに変更すると、自分の時計をESTタイムゾーンに設定すると、自分のコードが正常に動作します。私のコードはESTとして動作します。あなたは次のコードが問題であることを教えてください。

 NSDate *localDate = [NSDate date]; 
    NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 
    NSString *time = [NSString stringWithFormat:@"/Date(%@-0000)/", [NSNumber numberWithLongLong:[gmtDate timeIntervalSince1970] * 1000]]; 
+0

現在時刻が2011年12月20日午前5時15分00秒0000しかし、私が出てきています私のNSLog gmtDateが1と置けば)ESTティムゾーンです:2011-12-21 3:15: 00 +0000 2)PSTタイムゾーン:2011-12-21 06:15:00 +0000。どちらが間違っている。私はGMTの日付が正しくないと思う。あなたが思うこと ? – AAV

答えて

7

あなたは、単にtimeIntervalSince1970を呼び出すことにより、エポックGMT時間を得ることができます。

NSString *time = [NSString stringWithFormat:@"/Date(%lld-0000)/", 
        (long long)([[NSDate date] timeIntervalSince1970] * 1000)]; 
+0

最初にtimeIntervalSince1970を入力するとJSONのミリ秒が経過します。私はこの論理を最初に実装しましたが、正解を見つけることができませんでした。 – AAV

+0

更新された回答。 GMT時間を得るために時間帯の計算を行う必要はなく、1つのライナーで必要なのはすべてです。 – Joe

+0

@AmitVyawahare:timeIntervalSince1970は秒を単位として使用しますが、NSTimeIntervalを返します。NSTimeIntervalは2分の1で、分数精度がかなりあります。だからジョーの解決策は正しいですし、ミリ秒の解像度を与える必要があります。 – Tommy

0

@joeと@tommyが正しいです。あなたが言及したのと同じ方法でも結構です。サーバーデータベースに問題がありました。私はハックを見つけた。私はちょうど現在の現地日に18000(5時間)秒を追加する必要があり、私は良いです。だから、コードが

 NSDate *localDate = [NSDate date]; 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] + 18000; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

    NSString *time = [NSString stringWithFormat:@"/Date(%@-0000)/", [NSNumber numberWithLongLong:[gmtDate timeIntervalSince1970] * 1000]]; 
+0

これは本当に良い解決策ではありません(あなたがハックという言葉を使って以来知っているように)、 'EST'と' EDT'があることを忘れないでください。あなたのサーバーは、正確なタイムゾーンに戻って時間を表示する必要があります。解決策は、 "-0000"を "-0500"(EST)/ " - 0400"(EDT)に変更することです。 – Joe

+0

あなたは正しいハックは良くありませんが、ポイントサーバーが固定されていない限り、私は同じ治療コードを使用する必要があります。ありがとう、 - AV – AAV