繁体   English   中英

在android中解析json日期字符串

[英]Parse json date string in android

我在Android应用程序中从服务器获得了1970年以后的毫秒数的json字符串。

看起来像这样: \\/Date(1358157378910+0100)\\/

我如何将其解析为Java日历对象,或者只是从中获取一些日期值? 我应该从正则表达式开始,只是得到毫秒? 服务器是.NET。

谢谢

时间似乎也有时区,所以我会做这样的事情:

String timeString = json.substring(json.indexOf("(") + 1, json.indexOf(")"));
String[] timeSegments = timeString.split("\\+");
// May have to handle negative timezones
int timeZoneOffSet = Integer.valueOf(timeSegments[1]) * 36000; // (("0100" / 100) * 3600 * 1000)
int millis = Integer.valueOf(timeSegments[0]);
Date time = new Date(millis + timeZoneOffSet);

从接受的答案复制,修复了一些错误:)

    String json = "Date(1358157378910+0100)";
    String timeString = json.substring(json.indexOf("(") + 1, json.indexOf(")"));
    String[] timeSegments = timeString.split("\\+");
    // May have to handle negative timezones
    int timeZoneOffSet = Integer.valueOf(timeSegments[1]) * 36000; // (("0100" / 100) * 3600 * 1000)
    long millis = Long.valueOf(timeSegments[0]);
    Date time = new Date(millis + timeZoneOffSet);
    System.out.println(time);

是啊,ü可以substring你的json从“(”到“)”,转换成string来米利斯,并通过在calendar对象。

String millisString = json.substring(json.indexOf('('), json.indexOf(')'));

我想你可以这样:

json.getAsJsonPrimitive().getAsString();

json它是一个JsonElement

编辑:你可以发送没有日期(),只是数字,不是吗? 如果您使用的是JSON,为什么不使用Date对象?

试试这个..

String jsonDate = "\/Date(1358157378910+0100)\/";
String date = "";
 try {
String results = jsonDate.replaceAll("^/Date\\(","");
results = results.substring(0, results.indexOf('+'));                       
long time = Long.parseLong(results);
Date myDate = new Date(time);

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
date = sdf.format(myDate);
    System.out.println("Result Date: "+date);
} 
catch (Exception ex) {
     ex.printStackTrace();
     }

这是一个更完整的解决方案,基于@pablisco答案:

public class DateUtils {

    public static Date parseString(String date) {

        String value = date.replaceFirst("\\D+([^\\)]+).+", "$1");

        //Timezone could be either positive or negative
        String[] timeComponents = value.split("[\\-\\+]");
        long time = Long.parseLong(timeComponents[0]);
        int timeZoneOffset = Integer.valueOf(timeComponents[1]) * 36000; // (("0100" / 100) * 3600 * 1000)

        //If Timezone is negative
        if(value.indexOf("-") > 0){
            timeZoneOffset *= -1;
        } 

        //Remember that time could be either positive or negative (ie: date before 1/1/1970) 
        time += timeZoneOffset;

        return new Date(time);
    }
}

一些其他答案,例如pablisco ,对于解析字符串以提取数字是正确的,这是自纪元以来的毫秒数。 但他们使用过时的日期时间类。

java.time

Java 8及更高版本内置了java.time框架。 一个巨大的进步。 灵感来自Joda-Time JSR 310定义。 ThreeTen-Extra项目扩展。 通过ThreeTen-BackPort项目反向移植到Java 6和7,该项目由ThreeTenABP项目包装为Android。

分别考虑输入的两个部分。 一个是来自epoch的计数,以毫秒为单位,另一个是来自UTC偏移量

假设源使用与java.time相同的纪元(1970年的第一个UTC时刻),我们可以使用它来实例化一个Instant对象。 InstantUTC时间轴上的一个时刻。

    String inputMillisText = "1358157378910";
    long inputMillis = Long.parseLong ( inputMillisText );
    Instant instant = Instant.ofEpochMilli ( inputMillis );

接下来我们解析来自UTC的偏移量。 这里的诀窍是我们不知道来源的意图。 也许他们的意思是预期的日期时间 UTC 一个小时,因此我们应该将该偏移文本作为一个公式,增加一个小时来达到UTC。 或者他们意味着显示的时间 UTC 一个小时。 常用的ISO 8601标准定义了后者,因此我们将使用它。 但你真的应该调查你的数据源的意图。

    String inputOffsetText = "+0100";
    ZoneOffset zoneOffset = ZoneOffset.of ( inputOffsetText );

我们将InstantZoneOffset结合起来以获得OffsetDateTime

    OffsetDateTime odt = OffsetDateTime.ofInstant ( instant , zoneOffset );

转储到控制台。

    System.out.println ( "inputMillis: " + inputMillis + " | instant: " + instant + " | zoneOffset: " + zoneOffset + " | odt: " + odt );

inputMillis:1358157378910 | 时间:2013-01-14T09:56:18.910Z | zoneOffset:+01:00 | odt:2013-01-14T10:56:18.910 + 01:00

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM