将带有偏移的Json Date转换为java日期

时间:2016-07-15 13:18:13

标签: java json datetime odata

我有一个带偏移量的Json日期。我需要将其转换为java。

Edm.DateTime

"/Date(<ticks>["+" | "-" <offset>)/"

<ticks> = number of milliseconds since midnight Jan 1, 1970

<offset> = number of minutes to add or subtract

使用下面复制的answer,我可以将此日期转换为Java。但是,这不考虑偏移分量。有没有更简单的方法来解决偏移。

Date date = new Date(Long.parseLong(jsonDate.replaceAll(".*?(\\d+).*", "$1")));

以下是我以json日期格式获取的一些字符串日期

/日期(1463667774000 + 0400)/

/日期(1463667774000-5300)/

下面的计划和结果

   str = "/Date(1463667774000-9000)/";
     date = new Date(Long.parseLong(str.replaceAll(".*?(\\d+).*", "$1")));
     System.out.println("1st "+ date);

      1st Thu May 19 19:52:54 IST 2016

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

以下是有关如何解析自定义日期的示例。

// test value
String[] jsonDates = {"/Date(1463667774000-9000)/","/Date(1463667774000)/", "/Date(1463667774000+0400)/"};
//                          | preceded by "("
//                          |       | group 1: timestamp
//                          |       |    | optional group 2: "+" or "-"
//                          |       |    |      | optional group 3
//                          |       |    |      | (within group 2):    
//                          |       |    |      | minutes
//                          |       |    |      |       | followed by ")"
Pattern p = Pattern.compile("(?<=\\()(\\d+)(([-+])(\\d+))?(?=\\))");
for (String jsonDate: jsonDates) {
    Matcher m = p.matcher(jsonDate);
    // matching pattern...
    if (m.find()) {
        // found: parsing timstamp
        long timestamp = Long.parseLong(m.group(1));
        Integer minutes = null;
        Boolean addOrSubstract = null;
        if (m.group(2) != null) {
            // parsing sign
            addOrSubstract = "+".equals(m.group(3)); 
            // parsing minutes
            if (m.group(4) != null) {
                minutes = Integer.parseInt(m.group(4));
            }
        }

        // initializing calendar
        Calendar c = Calendar.getInstance();
        c.setTime(new Date(timestamp));
        // adding/removing minutes if parsed
        if (minutes != null) {
            c.add(
                Calendar.MINUTE, 
                addOrSubstract != null ? 
                (addOrSubstract ? minutes : -minutes) : 0
            );
        }
        Date date = c.getTime();
        System.out.println(date);
    }
    // not matched, different format
    else {
        // TODO error
    }
}