2

NSDate を MySQL フィールドに保存したいと思います。どのタイプがいいですか?日付またはタイムスタンプ? また、NSDate をフォーマットして (PHP スクリプトに) 送信し、フィールドに保存する方法を教えてください。

4

5 に答える 5

4

あなたは2つの質問をしました。

MySQL DATETIME と TIMESTAMP については、フィールド 'datetime' または 'timestamp' を使用する必要がありますか? を参照してください。

PHP経由でNSDateからMySQLにアクセスすることについて...

NSDate は、ある時点を表すオブジェクトです。ネットワーク経由で送信するには、何らかの形式にシリアル化する (つまり、文字列に変換する) 必要があります。yyyy-MM-dd HH:mm:ss最も簡単な方法は、MySQL が必要とするため、形式に入れることです。

NSDateFormatterNSDate オブジェクトをその形式の文字列に変換するために使用します。フォーマッターのタイム ゾーンを必ず UTC に設定してください。これにより、NSDate が計算されたデバイス/コンピューターのタイム ゾーンに関係なく、一貫した結果が得られます。次に、ネットワーク経由で PHP スクリプトに送信します。

PHP スクリプトでは、値を直接取得して DATETIME 列に保存できます。

おまけ: 必ず準備済みステートメントを使用してください (PHP に付属の PHP PDO ライブラリーはこれを許可します)。そうしないと、SQL インジェクションの危険にさらされます。

于 2013-02-01T20:12:35.753 に答える
0

私は自分のアプリで一度同じことをしました。以前は NSDate を文字列として保存していました。しかし、私は自分のプロジェクトで SQLite を使用しました。しかし、NSDate を文字列として保存することは、私にとっては非常にうまくいきました。データのフェッチ時に、文字列を再度 NSDate に変換します。このアプローチには、常に文字列形式でデータをフェッチするため、ほとんど利点がないため、プロジェクトでの処理が非常に簡単です。

于 2013-02-01T19:35:18.853 に答える
0

これを日時形式 (YYYY-MM-DD HH:MM:SS) に変換します。そうすれば、Unix エポックの問題や y38k の問題がなくなります。さらに、PHP はそのフォーマットを非常に簡単に扱うことができます。

于 2013-02-01T20:04:45.660 に答える
0

MySQL の新しいバージョンでは小数秒がサポートされているため、これに対する私の解決策は次のとおりです。

@implementation NSDate (MySQL)

//used to send a utc date to the server.
-(NSString*)yourprefix_MySQLString{
    static NSDateFormatter *df = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        df = [[NSDateFormatter alloc] init];
        // [df setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"]; can't use this because three S's
        // is the maximum and rest are 0, e.g. 1415986217.544384 with six S's becomes .544000
        // so missing some of the fraction.
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    });
    double d = [self timeIntervalSince1970];
    d = d - floor(d); // extract fraction
    d*=1000000; // convert to micros
    d = round(d);
    return [NSString stringWithFormat:@"%@.%06d", [df stringFromDate:self], (int)d];
}

@end

例:

NSDate* d = [NSDate date];
NSLog(@"%@", d);
NSLog(@"%f", [d timeIntervalSince1970]);
NSLog(@"%@", [d yourprefix_MySQLString]);

出力:

2014-11-14 17:47:33 +0000
1415987253.326594
2014-11-14 17:47:33.326594

2 行目と 3 行目で分数が正確に一致していることに注意してください。

いつものように、他の開発者カテゴリとの衝突を防ぐために、カテゴリに独自のプレフィックスを付けてください。

于 2014-11-14T17:49:06.127 に答える