我正在开发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月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"
}
]
答案 0 :(得分:2)
+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毫秒。所以你可以解析你的字符串:加号之前是什么时间,时区后面是什么。
答案 1 :(得分:1)
我想提供现代解决方案
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 java.time
。并且阻止问题和其他答案中使用的课程Date
,Calendar
和TimeZone
。它们已经过时了,现代Java日期和时间API可以更好地使用。
Oracle tutorial: Date Time解释如何使用java.time
。