我有一个允许用户重新加载最新消息的应用程序,所以我所拥有的是获取最新数据的PHP脚本选择在最新日期之后或等于最新日期的所有新消息。
我的问题是我比较TimeStamp(可能是1402382737)还是比较实际日期。我现在进入代码:
以下是选择最新消息的SQL:
<environmentVariables>
<ENABLE_DEBUG>${maven.some.property.set.when.debug.is_enabled}
</ENABLE_DEBUG>
</environmentVariables>
以下是Objective-C代码:设置最新日期:
$sql = "select m.*, u.*, at.*, UNIX_TIMESTAMP(M_Date) as M_Date2 from M_Messages m inner join AT_AddThread at on at.AT_ID = m.M_AT_ID inner join U_Users u on u.U_ID = m.M_U_ID where M_AT_ID = :idThread and m.M_Date >= :lastDate order by m.M_Date ASC";
我是否将TimeStamp发送回PHP脚本或实际日期,如果我发回TimeStamp,我需要修改我的select语句:
if((NSNull *)[dict objectForKey:@"M_Date2"] != [NSNull null]){
NSString *dateTS = [dict objectForKey:@"M_Date"];
NSString *timestampString = [dict objectForKey:@"M_Date2"];
double timestampDate = [timestampString doubleValue];
NSDate *d = [NSDate dateWithTimeIntervalSince1970:timestampDate];
NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
[_formatter setDateFormat:@"dd.MM.yyyy HH:mm:ss"];
m_Date = [_formatter stringFromDate:d];
if (counter == 1) {
lastDatePostActivity = dateTS;
}
}
因为应用程序将拥有“环球时报”,所以如果来自其他国家/地区的其他用户发送消息,那么所有时区应该与您所在的每个国家/地区匹配,这就是为什么我不确定是使用时间戳还是实际日期< / p>
答案 0 :(得分:2)
您不得在客户端使用NSDate对象, 用户可能有不同的时区或不正确的时间,
当您从后端第一次获取数据时,您还必须提供当前服务器时间并保存它,下次当您想从后端获取内容时,您将提供此(已保存)时间戳,后端将过滤消息,< / p>
如果您不想保存此时间戳,您可以随时检入当前消息,消息的最大时间戳(同样,这些时间戳应由服务器生成)并使用它,
所以想象你有2个方法,一个从后端获取数据,另一个在当前客户端设备上返回last-update-date,
您可以直接使用时间戳并通过php将时间戳转换为日期对象或字符串(与SQL数据库使用的格式相同)
例如
$date = date('Y-m-d H:i:s',$timestamp);
步骤。
这是一个简单的例子
// php example
echo json_encode(Array( 'data' => $yourData, 'timestamp' => time() ));
//objc example
- (NSNumber *)lastTimestamp {
NSNumber *timestamp = [[NSUserDefaults standardUserDefaults] objectForKey:@"timestamp"];
if(!timestamp) timestamp = @(0);
return timestamp;
}
NSDictionary *result = fetchDataFromBackendWithTimestamp([self lastTimestamp]);
// Save messages
NSNumber *timestamp = result[@"timestamp"];
[[NSUserDefaults standardUserDefaults] setObject:timestamp forKey:@"timestamp"];
[[NSUserDefaults standardUserDefaults] synchronize];
// Php SQL Query will be somethng like this
$sql = "SELECT * FROM YOUR_TABLE WHERE date_field > :date_field ";
$statement = $mysql->prepare($sql);
$date = date('Y-m-d H:i:s',$timestamp);
$statement->bindParam(":date_field",$date);
$statement->execute();
while($row = $statement->fetch(PDO::FETCH_ASSOC)) {
// do something with the row
}