2014-02-14 37 views
2

我有一個遊戲客戶端Google App Engine服務器。我的服務器向客戶端發送一個UTC timedate字符串,這個字符串自表示最後一次播放的日期戳記的紀元以來就是毫秒。我希望我的客戶報告自上次播放以來有多少天/小時/分鐘。我有這個工作在我的iOS客戶端,但不能讓它在Android中工作。我已經嘗試了很多選擇,有些使用Joda-Time某些Date對象是直的Java,時間總是偏移幾個小時。奇怪的是,時間不是一小時..可能會關閉2小時34分鐘..所以我不認爲我的問題只是一個時區的事情,否則會在一小時內沒有?需要幫助轉換Java中的UTC日期字符串

基本上我需要得到這個UTC時間,然後獲得UTC當前時間以及..比較差獲得天/小時/分鐘

這裏就是我的,我使用的Joda-Time庫:

例如我的服務器發送了我這個字符串「1392392591.0」(恰好是UTC時間大約上午7:45 PST)

public String convertDateString (String date) { 

     Float gameEpoch = Float.parseFloat(date); 

     DateTime now = new DateTime(); 
     DateTime gameTime = new DateTime(gameEpoch.longValue() * 1000); 

     Period p = new Period(gameTime, now, PeriodType.dayTime()); 

     String dateString = ""; 
     if(p.getDays() > 0) 
      dateString = (p.getDays() + " days " + p.getHours() + " hours ago"); 
     else if(p.getHours() > 0) 
      dateString = (p.getHours() + " hours " + p.getMinutes() + " minutes ago"); 
     else if(p.getMinutes() > 0) 
      dateString = (p.getMinutes() + " minutes ago"); 
     else 
      dateString = "Just Now"; 

     return dateString; 
    } 
+0

'我的服務器向客戶端發送UTC時間日期字符串,這是自epoch'毫秒。不。自從Unix [epoch] [1],而不是*毫秒*以來,客戶端正在接收*秒*。顯然你知道這一點,必須錯誤輸入,因爲你的示例代碼正確乘以1000.我正在爲其他讀者做這個筆記。 –

+0

我建議在'1000'上增加一個'L'作爲'1000L'。使用「long」原始類型進行數學計算時,這是個好習慣,以避免數據丟失。添加一個'L'也有助於使代碼自動記錄,這提醒我們正在處理多頭,而不是更常見的整數。 –

+0

會這樣做,謝謝羅勒 – Daniel

回答

5

不要從String轉換爲Float。花車只有7位有效數字,因此gameEpoch總是不準確。使用double,或更好的是long

+0

yup閱讀更多關於浮點搜索IEEE 754. – Vishrant

+0

我調整了我的代碼,仍然得到了約2小時2分差異從我期望看到的(我有一個JavaScript和ObjectiveC客戶端做同樣的事情,他們正在工作)。這裏是我轉換爲Long的更新:'long gameEpoch = Long.parseLong(date); '有意思的是,如果我只是檢查UTC的「現在」時間,那麼我的筆記本電腦時鐘就會關閉幾個小時,但這也是2分鐘的時間,我沒有想到。我應該期望將本地時間轉換爲UTC時間,而不僅僅是天數的變化。分鐘也會改變嗎?我不會這麼認爲啊 – Daniel

+0

啊!找到我被拋出的地方。我在android模擬器中運行這個模擬器..結果模擬器時鐘已關閉2分鐘,時區設置爲GMT。那讓我失望了。我上面的代碼與長調整工作。感謝您的幫助..我感到愚蠢。 – Daniel

0

answer by Tony the Pony是正確的。

順便說一句,在你的示例代碼的後半部分,你工作太辛苦了。 Joda-Time提供了一個PeriodFormatterBuilder類來幫助您生成這些描述性字符串。

這個示例代碼需要一些提示,但會讓你朝着正確的方向前進。

// Period(int years, int months, int weeks, int days, int hours, int minutes, int seconds, int millis) 
Period period = new Period(0, 0, 0, 2, 3, 4, 0, 0); 

PeriodFormatter formatter = new PeriodFormatterBuilder() 
     .printZeroAlways() 
     .appendYears() 
     .appendSuffix(" year", " years") 
     .appendSeparator(", ") 
     .printZeroRarelyLast() 
     .appendMonths() 
     .appendSuffix(" month", " months") 
     .appendSeparator(", ") 
     .appendWeeks() 
     .appendSuffix(" week", " weeks") 
     .appendSeparator(", ") 
     .appendDays() 
     .appendSuffix(" day", " days") 
     .appendSeparator(", ") 
     .appendHours() 
     .appendSuffix(" hour", " hours") 
     .appendSeparator(", and ") 
     .appendMinutes() 
     .appendSuffix(" minute", " minutes") 
     .toFormatter(); 

String timeSpanDescription = formatter.print(period); 

轉儲到控制檯...

System.out.println("period: " + period); 
System.out.println("timeSpanDescription: " + timeSpanDescription); 

當運行...

period: P2DT3H4M 
timeSpanDescription: 0 years, 2 days, 3 hours, and 4 minutes 
+0

感謝您的示例!自從發佈這個以來,我已經完善了我的工作,但我沒有利用PeriodFormatterBuilder。 – Daniel