2013-02-01 143 views
2

我想将NSDate保存到MySQL字段。最好的类型是什么? DATE或TIMESTAMP?以及如何格式化我的NSDate发送它(到PHP脚本)并将其保存在我的领域?NSDate到MySQL日期

+0

NSDate通常使用哪种格式? –

+0

我可以将NSDate转换为格式化为我想要的字符串 – Pierre

+0

这将回答您的问题的第一部分:[datetime vs timestamp?](http://stackoverflow.com/q/409286/808317) –

回答

4

你问了两个问题。

关于MySQL的DATETIME VS TIMESTAMP,看到Should I use field 'datetime' or 'timestamp'?

关于通过PHP从NSDate的获取到MySQL的

NSDate的是代表一个时间点的对象。要通过网络发送它,您需要将其序列化为某种格式(即将其转换为字符串)。最简单的方法是以yyyy-MM-dd HH:mm:ss的格式输入,因为这是MySQL所需要的。

使用NSDateFormatter将NSDate对象转换为该格式的字符串。确保将格式化程序时区设置为UTC,这样无论您的NSDate计算所在的设备/计算机的时区如何,您都可以获得一致的结果。然后通过网络发送给您的PHP脚本。

在PHP脚本中,您可以直接取值并将其保存到DATETIME列。

红利:确保使用预准备语句(PHP提供的PHP PDO库允许这样做),否则您将面临SQL注入的风险。

0

我在我的应用程序中做了同样的事情一次。我曾经将NSDate存储为字符串。但我在我的项目中使用了SQLite。但是将NSDate存储为字符串对我来说工作得很好。在获取数据时,再次将字符串转换为NSDate。这种方法也没什么好处,因为你总是以字符串格式获取数据,所以它很容易处理项目中的事情。

0

我会将它转换为日期时间格式(YYYY-MM-DD HH:MM:SS)。这样你就没有Unix时代问题或y38k问题。 Plus PHP可以很容易地使用这种格式。

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]; 
+0

我的问题,即MySQL返回这个日期时间:2014-05-07T16:58:44.000Z,所以在向后的方向上我需要其他格式,你知道我需要什么样的格式吗? –

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]); 

输出:在2号线和3号线的部分

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

通知完全匹配,这就是我想要的。

始终将自己的前缀放在类别中以防止与其他开发人员类别发生冲突。