2015-05-29 79 views
2

問題如下: 應用程序的快速詳細信息:根據日期排序數據(升序)。長日期(UNIX日期)問題

來自Web服務的UNIX日期/長日期形式爲JSON(13位數字)。當解析長日期時,我得到一個無效的日期值。

長日期:1428498595000 轉換日期:孫老師,4月26日47237 13時16分四十秒(經過解析) [注意年]

當使用在線轉換器(例如):http://www.onlineconversion.com/unix_time.htm,同輸出被複制。 我的目的是按升序排列日期,但不幸的是,由於年份顯示無關緊要,因此無法進行排序。

長日期1428498595(後手動刪除三個零,以測試它的網站上):週三,2015年4月8日13時09分55秒格林尼治標準時間(這是需要顯示正確的日期)

人幫助我瞭解可以做些什麼,以便我們可以手動刪除最後三個零? [存儲SQLite中解析的數據,然後在產生的UITableView所存儲的數據]

這是的AppDelegate

+(NSString *)convertUnixTime_to_SytemTime :(NSTimeInterval)timeInterval 
{ 
    NSDate * convertedDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.dateFormat = @"YYYY-MM-DD"; 
    NSTimeZone *localTime = [NSTimeZone systemTimeZone]; 
    [dateFormatter setTimeZone:localTime]; 
    NSString *timeStamp = [dateFormatter stringFromDate:convertedDate]; 
    return timeStamp; 
} 

這是在代碼

data.News_LastModifiedDate = [AppDelegate convertUnixTime_to_SytemTime:[[subcomponents objectAtIndex:2] doubleValue]]; 

由於多提前。

回答

2

從UNIX時代開始,日期/時間以毫秒爲單位,而不是秒。您可以除以1000.0以保持小數秒(如果它們曾經出現過):

NSTimeInterval seconds = (NSTimeInterval)1428498595000/1000.0; 

編輯。爲了解決你的問題的其他方面:

UITableView

店收藏SQLite中的分析數據,然後生成存儲的數據 原樣;作爲64位的int

+(的NSString *)convertUnixTime_to_SytemTime:(NSTimeInterval)一個時間間隔

此方法不轉換UNIX時間的系統時間;它將日期格式化爲一個字符串(錯誤地看它的樣子)。算了和只使用的唯一的代碼的第一行:

timeInterval如上變換爲秒的原始數量。唯一一次你想把日期作爲字符串的時候是在演示期間,而不是在處理過程中。

+1

這顯然是我刪除我的正確答案。他是否也不得不使用小寫字母「D」和「Y」? 'dateFormatter.dateFormat = @「yyyy-MM-dd」;' – Mika

+0

@Mikael是的,我會詳細說明。 – Droppy

0

您的時間戳以毫秒爲單位。只需將它除以1000即可獲得正確的日期/時間。

data.News_LastModifiedDate = [AppDelegate convertUnixTime_to_SytemTime:[[subcomponents objectAtIndex:2] doubleValue]/1000]; 

應該爲你工作。

0

每當你讀到JSON數據時,都應該有一個API描述,告訴你哪些數據以哪種形式傳遞。你會閱讀API描述並做任何需要的事情。如果沒有API描述,你可以做任何事情。

當您從JSON數據中讀取日期時,您應該首先將所發現的任何內容轉換爲NSDate *。 JSON沒有內置的日期類型。它有一個標準格式的日期,使用RFC3339,但你的JSON不這樣做。顯然它自1970年以來以毫秒爲單位使用UTC,並以整數形式存儲。 JSON解析器會將其作爲NSNumber返回。幸運的是,這很容易處理:

NSNumber* dateAsNumber = "whatever is needed to extract the integer"; 
NSTimeInterval dateAsInterval = [dateAsNumber doubleValue]/1000; 
NSDate* dateAsDate = [NSDate dateWithTimeIntervalSince1970: dateAsInterval]; 

您不應該將NSDate轉換爲其他任何東西。 NSDate是iOS上處理日期的標準類型。 CoreData將處理它。如果您直接使用SQL,請在存儲到數據庫之前以及從數據庫加載並在其他地方使用NSDate之後進行轉換。

順便說一句。什麼是SystemTime?如果您使用像convertUnixTime_to_SytemTime這樣的方法名稱,我會非常擔心,因爲沒有兩個人會同意系統時間。而你的方法不會返回系統時間,它會返回一些轉換爲字符串的內容。