Разобрать формат даты JSON в строку, используя GSON на Android - PullRequest
8 голосов
/ 13 июня 2011

Я получаю много дат из фида JSON.

Они выглядят так: \/Date(1307972400000+0200)\/

Мне нужно разбить эти даты на часы и минуты, используя Java.

РЕДАКТИРОВАТЬ:

Вот как далеко я зашел:

String s = dateString.replaceAll("^/Date\\(" , "");

Это дает мне следующий вывод: 1307972400000+0200)/

Как я могу удалить остальную часть этой строки, какие-либо предложения?

Я хочу, чтобы это понравилось так: 1307972400000L

Ответы [ 3 ]

16 голосов
/ 13 июня 2011

Это фид JSON из сервиса .Net. Я использую этот код:

public class GsonHelper {
    public static Gson createWcfGson() {
        GsonBuilder gsonb = new GsonBuilder();
        gsonb.registerTypeAdapter(Date.class, new WcfDateDeserializer());
        Gson gson = gsonb.create();
        return gson;
    }

    private static class WcfDateDeserializer implements JsonDeserializer<Date>, JsonSerializer<Date> {

        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/";
            Pattern pattern = Pattern.compile(JSONDateToMilliseconds);
            Matcher matcher = pattern.matcher(json.getAsJsonPrimitive().getAsString());
            String result = matcher.replaceAll("$2");
            return new Date(new Long(result));
    }

        @Override
        public JsonElement serialize(Date date, Type arg1, JsonSerializationContext arg2) {
            return new JsonPrimitive("/Date(" + date.getTime() + ")/");
        }
    }
}

Регистрирует пользовательский сериализатор и десериализатор для типа Date. Использовать просто: Gson gson = GsonHelper.createWcfGson(); и делай что хочешь.

Upd: Извините, предыдущий пример не работает с часовыми поясами. Проще использовать Calendar, чтобы учесть смещение часового пояса. Код будет выглядеть так:

public class GsonHelper {
    public static Gson createWcfGson() {
        GsonBuilder gsonb = new GsonBuilder();
        gsonb.registerTypeAdapter(Date.class, new WcfCalendarDeserializer ());
        Gson gson = gsonb.create();
        return gson;
    }

    public static class WcfCalendarDeserializer implements JsonDeserializer<Calendar>, JsonSerializer<Calendar> {

        public Calendar deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

            String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/";
            Pattern pattern = Pattern.compile(JSONDateToMilliseconds);
            Matcher matcher = pattern.matcher(json.getAsJsonPrimitive().getAsString());
            matcher.matches();
            String tzone = matcher.group(3);
            String result = matcher.replaceAll("$2");

            Calendar calendar = new GregorianCalendar();
            calendar.setTimeZone(TimeZone.getTimeZone("GMT" + tzone));
            calendar.setTimeInMillis(new Long(result));

            return calendar;
        }

        @Override
        public JsonElement serialize(Calendar calendar, Type arg1, JsonSerializationContext arg2) {
            return new JsonPrimitive("/Date(" + calendar.getTimeInMillis() + ")/");
        }
    }
}

Затем вы можете использовать возвращенный Calendar объект, чтобы получить часы и минуты (и при необходимости скорректировать часовой пояс).

calendar.get(Calendar.HOUR_OF_DAY);
calendar.get(Calendar.MINUTE);
0 голосов
/ 16 февраля 2012

Чтобы дополнить принятый ответ @Programmer Bruce, вы можете просто использовать это:

public static Long getTime(String date) {
    if (Utils.isEmpty(date))
        return -1l;
    String t = date.substring(date.indexOf('(') + 1);
    if (date.contains("+"))
        t = t.substring(0, t.indexOf('+'));
    else if (date.contains("-"))
        t = t.substring(0, t.indexOf('-'));
    else
        t = t.substring(0, t.indexOf(')'));
    return new Long(t);
}
0 голосов
/ 15 июня 2011

Как я могу удалить остальную часть этой строки, какие-либо предложения?

Я хочу, чтобы это понравилось так: 1307972400000L

Строго говоря, вы можете просто получитьподстрока от начала до символа «+».

String input = "/Date(1307972400000+0200)/";
String result = input.replaceAll("^/Date\\(" , "");
result = result.substring(0, result.indexOf('+'));
System.out.println(new Long(result));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...