使用时间戳或实际日期从数据库中调用最新数据


Objective-c - Calling Latest Data from Database using Timestamp or actual Date

我有一个应用程序,允许用户重新加载最新的消息,所以我有一个PHP脚本,获取最新的数据,选择所有的新消息之后或等于最新的日期。

我的问题是我比较时间戳(可能是1402382737)或我比较实际日期。现在进入代码:

下面是选择最新消息的SQL:

$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";

下面是设置最新日期的Objective-C代码:

    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;
        }
    }

我是否将时间戳发送回PHP脚本或实际日期,如果我发送回时间戳,我是否需要修改我的select语句:

$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 UNIX_TIMESTAMP(m.M_Date) >= :timestamp order by m.M_Date ASC";

因为应用程序将有环球时间,所以如果另一个用户从另一个国家发送消息,那么所有的时区应该匹配你所在的每个国家,这就是为什么我不确定是否使用时间戳或实际日期

你不能从客户端使用NSDate对象用户可能有不同的时区或不正确的时间,

当你第一次从后端获取数据时,你必须提供当前的服务器时间并保存它,下次当你想从后端获取东西时,你将提供这个(保存)时间戳,后端将过滤消息,

如果你不想保存这个时间戳,你可以检查当前消息,消息的最大时间戳是什么(同样,这些时间戳应该由服务器生成),并使用它,

假设你有两个方法,一个从后端获取数据,另一个返回当前客户端设备上的last-update-date,

您可以直接使用时间戳,并通过php将时间戳转换为日期对象或字符串(与SQL数据库使用的格式相同)

例如

$date = date('Y-m-d H:i:s',$timestamp);

步骤。

  1. 创建返回客户端的最后更新日期的函数
  2. 使用该日期获取消息(如果这是用户第一次想要获取数据,则使用时间戳0)
  3. 正确保存last-update-date时间戳,不要存储NSDate,如果用户更改日期而您使用不当,可能会出现错误。

下面是一个简单的例子

    // 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
}