我想将 NSDate 保存到 MySQL 字段。哪种类型最好?日期或时间戳?以及如何格式化我的 NSDate 以将其发送(到 PHP 脚本)并将其保存在我的字段中?
5 回答
首先创建一个日期格式化程序:
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];
你问了两个问题。
关于 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 注入的风险。
我曾经在我的应用程序中做过同样的事情。我曾经将 NSDate 存储为字符串。但是我在我的项目中使用了 SQLite。但是将 NSDate 存储为字符串对我来说效果很好。在获取数据时,将字符串再次转换为 NSDate。这种方法也没有什么好处,因为您总是以字符串格式获取数据,因此在项目中处理事情非常容易。
我会将其转换为日期时间格式(YYYY-MM-DD HH:MM:SS)。这样你就没有 Unix 纪元问题或 y38k 问题。另外,PHP 可以很容易地使用这种格式。
新版本的 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 行的分数完全匹配,这就是我想要的。
与往常一样,将您自己的前缀添加到类别中,以防止与其他开发人员类别发生冲突。