2

我想将 NSDate 保存到 MySQL 字段。哪种类型最好?日期或时间戳?以及如何格式化我的 NSDate 以将其发送(到 PHP 脚本)并将其保存在我的字段中?

4

5 回答 5

9

首先创建一个日期格式化程序:

NSDateFormatter *gmtDateFormatter = [[NSDateFormatter alloc] init];
gmtDateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
gmtDateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

转换NSDate为 MySQL 兼容的日期字符串:

NSString *dateString = [gmtDateFormatter stringFromDate:aDate];

要转换回来:

NSDate *date = [gmtDateFormatter dateFromString:aString];
于 2013-02-04T08:07:41.623 回答
4

你问了两个问题。

关于 MySQL DATETIME 与 TIMESTAMP,请参阅我应该使用字段 'datetime' 还是 'timestamp'?

关于通过 PHP 从 NSDate 到 MySQL...

NSDate 是一个表示时间点的对象。要通过网络发送,您需要将其序列化为某种格式(即,将其转换为字符串)。最简单的做法是把它放在 formatyyyy-MM-dd HH:mm:ss中,因为那是 MySQL 想要的。

用于NSDateFormatter将 NSDate 对象转换为该格式的字符串。确保将格式化程序时区设置为 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 回答