簡體   English   中英

如何將傳入的Json日期轉換為java日期格式?

[英]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毫秒。 所以你可以解析你的字符串:加號之前是什么時間,時區后面是什么。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM