2

NOW()を使用して時刻を設定するmySQLデータベースにユーザー間で送信されたデータの時刻を保存するサーバーがあります。時間を受信者の現地時間に変換しようとしていますが、あまり運がありません(保存する前に時間を変換しますが、私が言うように、送信者ではなく受信者にローカルな時間を設定したいです)。日付は文字列としてアプリに返され、次のように調整しようとしました。

NSString *string1 = [[receivedMessages objectAtIndex:thisRow]objectAtIndex:2];
NSDate *messageDate; 
NSCalendar* cal = NSCalendar.currentCalendar;
NSTimeZone* tz = cal.timeZone;   

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM dd yyyy hh:mma"];
[formatter setTimeZone:tz];

messageDate = [formatter dateFromString:string1];

日付をフォーマットしますが、正しくはありません。アプリが次のように受け取る日付:

April 5 2012 5:49AM

に変換されます:

2012-04-05 04:49:00 +0000

そもそも、xcodeが日付がどのタイムゾーンに属しているかをどのように判断するのか疑問に思っていますか?

実際、私はそれを使用してもう一度テストしました

NSTimeZone *pst = [NSTimeZone timeZoneWithAbbreviation:@"PST"];

代わりに

 NSCalendar* cal = NSCalendar.currentCalendar;
 NSTimeZone* tz = cal.timeZone;

そしてそれはまだ私に2012-04-0504:49:00+0000としての時間を与えます。

誰かアイデアはありますか?

どうもありがとう

4

1 に答える 1

2

Apple docs からmessageDate = [formatter dateFromString:string1];NSDate を返します。結果を表示しているときは、 ISO 8601 dateに「文字列化」された (私が推測している) NSDate オブジェクトを出力しています。これらの NSDate オブジェクトは、絶対時間 (タイムゾーン情報なし) に正規化されています。

日付オブジェクトを取得したら、さらに一歩進んで出力をフォーマットします。あなたが示している tz は元の時間のものだと推測しているので、これで問題ありません ( dateFromString「絶対時間」に変換されます)。追加する必要があるのは、localizedStringFromDate:dateStyle:timeStyle:のようなものだけで、ローカルで時刻を取得できます。

//If this is not in UTC, we don't have any knowledge about
//which tz it is. MUST BE IN UTC.
dateString = "2012-03-12 9:53:23"

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM dd yyyy hh:mma"];

NSDate *date = [formatter dateFromString:dateString];

NSString *result = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle];

//The result should be in MY timezone automatically.
于 2012-04-05T15:21:46.283 に答える