如何将传入的Json日期转换为java日期格式?

我正在研究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毫秒。 所以你可以解析你的字符串:加号之前是什么时间,时区之后是什么。

java.time

我想贡献现代的解决方案

  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。 并且阻止问题和其他答案中使用的类DateCalendarTimeZone 。 它们已经过时了,现代的Java日期和时间API可以更好地使用。

链接

Oracle教程:Date Time解释了如何使用java.time