2011-08-20 69 views
2

我得到了下面的日期格式,我從一個API得到(是的,我試圖讓他們改變API ... dailywtf故事):奇怪的日期格式的Java日期

\/Date(1310481956000+0200)\/ 

我怎麼能轉換這成一個Java日期? (java.util.Date)

這來自.NET JSON Web服務。

+2

該格式首先代表什麼?它是如何工作的?它是時間戳嗎? –

+0

我認爲這種格式在某些.NET服務中用於JSON。 – Jonas

回答

9

不知道日期/時間字符串代表什麼,讓我猜測。

1310481956000看起來是在紀元後的毫秒,而+0200是相對於GMT的偏移量。

下面的代碼似乎表明它還有:

final TimeZone tz = TimeZone.getTimeZone("GMT+0200"); 
final Calendar cal = Calendar.getInstance(tz); 
cal.setTimeInMillis(1310481956000L); 
final SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 
f.setTimeZone(tz); 
System.out.println(f.format(cal.getTime())); 

打印2011-07-12 16:45:56 GMT+02:00

+0

我已將日期轉換爲字符串'「MM/dd/yyyy」'格式。我想將轉換後的日期解析爲Java.util.Date格式的「MM/dd/yyyy」格式。但輸出格式更改爲「2011-07-12 16:45:56 GMT + 02:00」格式。我想保持目前的格式(「MM/dd/yyyy」)。但需要Java.util.Date **不是STRING **。任何幫助請... – vissu

+0

@vissu pepala Java中的日期在內部只是整數,默認的日期輸出格式完全依賴於系統/語言環境。如果您想以特定格式輸出日期,請使用上面的SimpleDateFormat指定格式。 –

2

如何將其轉換爲Java日期? (java.util.Date)

首先,獲取「他們」以清楚準確地告訴您日期格式的含義。 (如果他們不會或不能猜到,請參閱下面的內容)

接下來編寫一個自定義分析器來解析字符串並提取信息內容。

最後,將信息內容轉換爲與Date構造函數中的一個匹配的表單並創建一個實例。


我的猜測是,1310481956000部分是由於UNIX紀元(1970/01/01T00:00)的毫秒數(?MET),並且所述0200表示時區2小時抵消。但是,你不應該依賴猜測。獲取「他們」給你的規範,或至少一些例子和他們對應的實際時間/時區。

1

你必須瞭解從API提供的格式,但它似乎是時間epoch +偏移區域。要轉換它,你可以嘗試。

final String fromAPI = "1310481956000+0200" 
final String epochTime = fromAPI.substring(0, fromAPI.indexOf("+")); 
final String timeZoneOffSet = fromAPI.substring(fromAPI.indexOf("+"), fromAPI.size()); 

Date date = new Date(Long.parseLong(epochTime)); 

請注意,我沒有做任何事情與時區(如果那是它是什麼)。你必須處理,但這應該讓你走上正確的道路。

0

TL;博士

Instant.ofEpochMilli( 
    java.lang.Long.parseLong("1310481956000") 
).atOffset(ZoneOffset.of("+0200")) 

使用java.time

accepted Answer是正確的,但已經過時。處理這個問題的現代方法是通過java.time類。

輸入不明確。是從1970年第一個時間點的UTC 1970-01-01T00:00:00:Z的第一個日期時間的Unixepoch reference算起,然後在UTC之前兩個小時進行調整?如果是這樣,這裏看到的這個示例代碼有效。

首先將輸入號碼解析爲InstantInstant類表示UTC中時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

提取字符串的第一部分並解析爲long

long millisSinceEpoch = java.lang.Long.parseLong("1310481956000"); 
Instant instant = Instant.ofEpochMilli(millisSinceEpoch); 

instant.toString():2011-07-12T14:45:56Z

提取您的字符串的最後部分,並解析爲ZoneOffset

ZoneOffset offset = ZoneOffset.of("+0200"); 

將偏移到Instant得到一個OffsetDateTime

OffsetDateTime odt = instant.atOffset(offset); 

odt.toString():2011-07-12T16:45:56 + 02:00

注意,一個offset-from-UTC不是一個時區。區域是偏移量一組處理異常的規則,如Daylight Saving Time (DST)

儘可能避開java.util.Date。但是如果你必須使用一個,你可以轉換爲java.time。尋找新的轉換方法添加到舊的類。

java.util.Date d = java.util.Date.from(odt.toInstant()); 

d.toString():星期二07月12 14點45分56秒GMT 2011

參見live code at IdeOne.com覆蓋該整個例子。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore