2017-09-13 126 views
0

我從服務器獲取很長的日誌。我正在使用日曆來執行此操作。如何使用java中的默認GMT時間創建日曆

事情是,很長一段時間從服務器(它有用戶本地時間)轉換而來,但我將它作爲默認的GMT,並將其轉換爲本地時間。

因此,它轉換兩次。由於我知道它的正確性,我怎樣才能在不改變它到本地的情況下顯示它(似乎默認是這樣做的)?我的代碼:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));   
calendar.setTimeInMillis(dateLong); 
SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
format1.format(cal.getTime()); 
+0

要正確理解你的問題,你想在「格林威治標準時間」或當地時間的時間(不改變它)? – procrastinator

+0

@cracrastinator in GMT。我在本地時間從服務器獲取它,但它在GMT中檢測到它並再次進行轉換。所以,如果我在GMT顯示它(因爲已經轉換),它應該顯示它是正確的。 –

+1

它的工作原理。謝謝,發佈它作爲答案! –

回答

1

而不是使用Calendar使用SimpleDateFormat。以下代碼顯示了正確的結果。

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
    df.setTimeZone(TimeZone.getTimeZone("GMT")); 
    String result = df.format(dateLong); 
    System.out.println(result); 
0

對不起,我誤會 我猜你在毫秒的時間。那麼,從那裏:

Date dateCreated = new Date(timeInMilliseconds); 

然後當你創建日曆,設定時間後剛剛成立的時區,因爲setTimeInMillis壓倒一切,當你創建實例

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(new java.util.Date().getTime()); 
calendar.setTimeZone(TimeZone.getTimeZone("GMT")); 

這是它以前的設置時區

+0

我不明白,這個字符串的結果是:2017-09-13T12:44:20Z –

+0

我想我誤解了。所以,你有一個以毫秒爲單位的Date對象(這就是爲什麼你說Long值),然後你想做什麼?由於日期已創建時區值創建一個新的日期(timeInMilliseconds) – nineunderground

+0

我從服務器獲得長期,但我認爲通過它轉換爲用戶的本地時區。但是,我將它作爲GMT並將其重新轉換爲用戶的本地時區。所以它比現在多2小時。由於我從服務器獲得它,如何在不轉換它的情況下顯示它(默認情況下,日曆時區是用戶時區,因此它會轉換日期)。我試過Calendar.getInstance(TimeZone.getTimeZone(「GMT」)),它沒有工作。 –

1

其他的答案已經提供CalendarSimpleDateFormat解決方案。我只想添加另一種方法。

老班(DateCalendarSimpleDateFormat)有lots of problemsdesign issues,他們正在被新的API取代。

在Android中(如果您可以爲項目添加依賴項 - 在這種情況下完全值得,IMO),您可以使用ThreeTen Backport,它是Java 8新日期/時間類的一個很好的後端。要使其工作,您還需要ThreeTenABP(更多關於如何使用它here)。

首先,您可以使用org.threeten.bp.Instant將millis值轉換爲相應的UTC時刻。然後你使用org.threeten.bp.format.DateTimeFormatter來定義你想要的日期格式。我還使用了org.threeten.bp.ZoneOffset,表明格式化應該使用UTC日期:

long dateLong = System.currentTimeMillis(); 
// convert long millis value to Instant 
Instant instant = Instant.ofEpochMilli(dateLong); 
// create formatter in UTC 
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") 
    .withZone(ZoneOffset.UTC); 
// format it 
System.out.println(fmt.format(instant)); 

的輸出將是這樣的:

13/09/2017 11時28分02秒