how to convert incoming Json date into java date format?
我正在研究Xero帐户Apis
在json的回复中我得到的日期如下
1 | "Date":"/Date(1455447600000+1300)/", |
获取dateString字段的日期也相同
1 | "DateString":"2016-02-15T00:00:00", |
我试图将上述日期转换为字符串,但获取不同的日期。 在我们的api中,两个日期相同,在Date字段和DateString字段中。
1 2 3 4 5 6 7 |
输出:
JSON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | [ { "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" } ] |
如果您只将日期部分解析为long:
1 2 3 |
你得到(我在GMT时区)
1 | Sun Feb 14 11:00:00 GMT 2016 |
你可以看到11 + 13 = 24,第二天24小时。
您可以从偏移量中获取时区,知道偏移量为13小时和零分钟:
1 2 3 4 5 | 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())); |
哪能给我
1 | Feb 15, 2016 |
在这里,我计算偏移为13小时,因此13 * 3600秒,因此13 * 3600 * 1000毫秒。所以你可以解析你的字符串:加号之前是什么时间,时区后面是什么。
java.time
我想贡献现代的解决方案
1 2 3 4 5 6 7 8 9 10 | 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日期和时间API
链接
Oracle教程:日期时间,解释如何使用