[英]how to convert incoming Json date into java date format?
我正在研究Xero帳戶Apis在json的回復我得到的日期如下
"Date": "/Date(1455447600000+1300)/",
獲取dateString字段的日期也相同
"DateString": "2016-02-15T00:00:00",
我試圖將上述日期轉換為字符串,但獲取不同的日期。 在我們的api中,兩個日期相同,在Date字段和DateString字段中。
Long longDate=Long.valueOf("1455447600000")+Long.valueOf("1300");
Date date = new Date(longDate);
//TimeZone timeZone = TimeZone.getTimeZone("UTC"); //also tried this
Calendar cal=Calendar.getInstance();
cal.setTime(date);
System.out.println(cal.getTime());
輸出: Sun Feb 14 16:30:01 IST 2016
年2 Sun Feb 14 16:30:01 IST 2016
14日但是在StringDate中它是15 Feb
JSON:
[
{
"Date": "/Date(1455447600000+1300)/",
"Type": "ACCREC",
"Total": 460,
"Status": "AUTHORISED",
"Contact": {
"Name": "nn",
"Phones": [
],
"Addresses": [
],
"ContactID": "6831fd62-d6f1-4dc7-9338-24566074ecf6",
"ContactGroups": [
],
"ContactPersons": [
],
"HasValidationErrors": false
},
"DueDate": "/Date(1455620400000+1300)/",
"Payments": [
],
"SubTotal": 460,
"TotalTax": 0,
"AmountDue": 460,
"HasErrors": false,
"InvoiceID": "dcf1f09e-3e98-443e-981e-cdd9f296d607",
"LineItems": [
{
"TaxType": "OUTPUT",
"ItemCode": "Item2",
"Quantity": 20,
"Tracking": [
],
"TaxAmount": 0,
"LineAmount": 460,
"LineItemID": "2a6c5078-a462-4e8c-b277-d1164885b7d9",
"UnitAmount": 23,
"AccountCode": "200",
"Description": "Item2"
}
],
"Reference": "43223",
"AmountPaid": 0,
"DateString": "2016-02-15T00:00:00",
"CreditNotes": [
],
"Prepayments": [
],
"CurrencyCode": "INR",
"CurrencyRate": 1,
"IsDiscounted": false,
"Overpayments": [
],
"DueDateString": "2016-02-17T00:00:00",
"InvoiceNumber": "INV-0002",
"AmountCredited": 0,
"HasAttachments": false,
"UpdatedDateUTC": "/Date(1455475695503+1300)/",
"LineAmountTypes": "Exclusive"
}
]
+1300
不是毫秒偏移量,它是一個小時+分鍾的偏移量。 如果您只將日期部分解析為long:
Long longDate=Long.valueOf("1455447600000");
Date date = new Date(longDate);
System.out.println(date);
你得到(我在GMT時區)
Sun Feb 14 11:00:00 GMT 2016
你可以看到11 + 13 = 24,第二天24小時。
您可以從偏移量中獲取時區,知道偏移量為13小時和零分鍾:
Calendar c=Calendar.getInstance(TimeZone.getTimeZone(TimeZone.getAvailableIDs(13*3600*1000)[0]));
c.setTimeInMillis(longDate);
DateFormat df=DateFormat.getDateInstance();
df.setTimeZone(c.getTimeZone());
System.out.println(df.format(c.getTime()));
哪能給我
Feb 15, 2016
在這里,我計算偏移為13小時,因此13 * 3600秒,因此13 * 3600 * 1000毫秒。 所以你可以解析你的字符串:加號之前是什么時間,時區后面是什么。
我想貢獻現代的解決方案
Pattern jsonDatePattern = Pattern.compile("/Date\\((\\d+)([+-]\\d{4})\\)/");
String dateFromJson = "/Date(1455447600000+1300)/";
Matcher m = jsonDatePattern.matcher(dateFromJson);
if (m.matches()) {
long epochMillis = Long.parseLong(m.group(1));
String offsetString = m.group(2);
OffsetDateTime dateTime = Instant.ofEpochMilli(epochMillis)
.atOffset(ZoneOffset.of(offsetString));
System.out.println(dateTime);
}
輸出:
2016-02-15T00:00 + 13:00
這與您的JSON日期字符串中的日期和時間一致,並另外通知您UTC偏移量。
我正在使用並熱烈推薦java.time
,即現代Java日期和時間API。 並且阻止問題和其他答案中使用的類Date
, Calendar
和TimeZone
。 它們已經過時了,現代Java日期和時間API可以更好地使用。
Oracle教程:Date Time解釋如何使用java.time
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.