.net JSON Формат даты - PullRequest
       3

.net JSON Формат даты

1 голос
/ 29 сентября 2011

В качестве ответа от сервиса .net я получаю следующий формат даты: / Дата (1233323754523 + 0100) /

1233323754523 - это дата в формате отметки времени, но я не знаю, что означает +0100 и как ее сгенерировать из кода Java?

Спасибо

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Я предполагаю, что отметка времени указана в UTC, а смещение - это смещение UTC желаемого местного времени.Если временная метка находится в заданном смещении от UTC, вам придется сгенерировать ее немного по-другому.

Надежный способ создать ее в Java - использовать библиотеку Joda-Time ,что намного лучше, чем классы по умолчанию java.util.Date и java.util.Calendar.

// A formatter that prints the timezone offset
DateTimeFormatter fmt = DateTimeFormat.forPattern("Z");

// The current date+time in the system default timezone.
DateTime dt = new DateTime();

// Create the result.
String result = "/Date(" + dt.getMillis() + fmt.print(dt) + ")/";

Немного прискорбно, что DateTimeFormat не имеет способа вывести миллисекунды, посколькуэпоха;это то, что требует объединения строк dt.getMillis().

Чтобы сгенерировать то же самое с использованием классов java.util, это выглядело бы примерно так:

// A formatter that prints the timezone offset
SimpleDateFormat df = new SimpleDateFormat("Z");    

// Current date+time in system default timezone.
Calendar now = Calendar.getInstance();

// Don't forget this if you use a timezone other than system default:
df.setTimeZone( now.getTimeZone() );

// Create the result
String result = "/Date(" now.getTimeInMillis() + df.format(now.getTime()) +")/";

По сути, это то же самое, что и Joda-Пример времени, но бит, где вам нужно скопировать часовой пояс из календаря в форматировщик даты, является основным источником ошибок.

2 голосов
/ 12 марта 2013

Вопрос немного устарел, но я думаю, что все еще есть люди, которые бьют себя головой о стену из-за этого превосходного выбора формата даты и времени;)

Адаптер типа сериализации и десериализации значения DateTime в формате .NET Json в Java для Gson Это работало для меня сейчас, так как около 2 лет.

package x

import java.lang.reflect.Type;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.regex.Pattern;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

/**
 * Serialises and deserialises a string representing a date produced by a .NET web service.
 * 
 * @author Diego Frehner
 */
public class TypeAdapterDate implements JsonSerializer<Date>, JsonDeserializer<Date> {

  /** Pattern for parsing date time values sent by a .NET web service. */
  private static Pattern pattern = Pattern.compile("^/Date\\([0-9\\+-]*\\)/$");

  private static DecimalFormat formatter = new DecimalFormat("#00.###");

  private static final long HOUR_IN_MILLISECOND = 60L * 60 * 1000;

  private static final String minusSign = "-";

  private static final String plusSign = "+";

  @Override
  public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext     context) throws JsonParseException {
    String value = json.getAsString();
    // example .NET web service return value: /Date(1302847200000+0200)/
    // milliseconds since midnight 1970 UTC + time zone offset of the server to UTC
    // GMT == UTC == UT it's all the same...afaik
    if (!pattern.matcher(value).matches()) {
      return null;
    }
    // get UTC millisecond value
    long utcMillisecond = Long.parseLong(value.substring(value.indexOf("(") + 1, value.indexOf(")") - 5));

    // new Date(long) takes milliseconds since 1970 in UTC
    return new Date(utcMillisecond);
  }

  @Override
  public JsonElement serialize(Date arg0, Type arg1, JsonSerializationContext arg2) {
    Date date = (Date) arg0;

    int zoneOffsetMillisecond = TimeZone.getDefault().getOffset(date.getTime());
    String sign = plusSign;
    if (zoneOffsetMillisecond < 0) { // negative offset
      sign = minusSign;
      zoneOffsetMillisecond *= -1;
    }
    int minute = (int) (zoneOffsetMillisecond % HOUR_IN_MILLISECOND);
    int hour = (zoneOffsetMillisecond / 1000 / 60 / 60);
    return new JsonPrimitive("/Date(" + date.getTime() + sign + formatter.format(hour) + formatter.format(minute) + ")/");
  }
}
2 голосов
/ 29 сентября 2011

Второе число просто указывает, что значение DateTime следует интерпретировать как локальное время даты (вместо UTC), само число игнорируется. Это описано в разделе «Расширенный формат информации / формат даты / времени» документа по адресу http://msdn.microsoft.com/en-us/library/bb412170.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...