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

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
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:

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"
  }
]


+1300不是毫秒偏移量,它是一个小时+分钟的偏移量。
如果您只将日期部分解析为long:

1
2
3
Long longDate=Long.valueOf("1455447600000");
Date date = new Date(longDate);
System.out.println(date);

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

链接

Oracle教程:日期时间,解释如何使用java.time