2015-07-13 31 views
1

最新我有一個應用程序,允許用戶重新加載最新的消息,因此我有什麼是一個PHP腳本,獲取之後或最新的數據選擇所有新郵件等於最近的日期。Objective-C的 - 調用數據從數據庫使用時間戳或實際日期

我的問題是我比較時間戳(可能是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腳本或實際的日期,如果我發回TimeStamp做我需要修改我的選擇語句到這:

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

因爲應用程序都將有環球時報所以如果從另一個國家另一個用戶發送郵件,那麼所有的時區應與你在全國是每一位,這就是爲什麼我不能確定是否使用時間戳或實際日期

回答

2

不得使用NSDate的對象從客戶端, 用戶可能有不同的時區或不正確的時間,

當您從後端獲取數據時,您還必須提供當前服務器時間和保存,下一次當你想獲取從後端將爲你提供這個(保存)時間戳和後端將過濾消息的東西,

如果你不想保存這個時間戳,你可以隨時檢查當前的消息,什麼是消息的最大時間戳(再次,這些時間戳應該由服務器生成)並使用它,

所以想象你有2種方法,一種從後端獲取數據,另一種在當前客戶端設備上返回最後更新日期,

您可以直接使用時間戳並將時間戳通過php轉換爲日期對象或字符串(與使用的格式相同通過你的SQL數據庫)

例如

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

步驟。

  1. 創建將返回客戶端最後更新日期
  2. 使用日期獲取信息的功能(如果這是第一次用戶想獲取數據,然後使用時間戳0)
  3. 正確保存上次更新日期的時間戳記,不要存儲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 
}  
+0

將SQL語句是什麼呢? – redoc01

+0

我用示例sql更新了我的答案 – ogres