ExtJSから次の形式の日付文字列を取得しています。
「2011-04-08T09:00:00」
この日付を逆シリアル化しようとすると、タイムゾーンがインド標準時に変更されます(時刻に+5:30が追加されます)。これは私が日付を逆シリアル化する方法です:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
これを行っても、タイムゾーンは変わりません。私はまだISTで日付を取得します:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
タイムゾーンの手間をかけずに日付をデシリアライズするにはどうすればよいですか?
回避策を見つけましたが、これを使用して、プロジェクト全体で各日付のセッターに注釈を付ける必要があります。 ObjectMapperの作成中に形式を指定する方法はありますか?
私がやったことは次のとおりです。
public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
@Override
public Date deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
String date = jsonParser.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
そして、これを使用して各日付フィールドのセッターメソッドに注釈を付けました。
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
これは私のために働く-私はジャクソン2.0.4を使用しています
ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);
このトピックに関する良いブログがあります: http://www.baeldung.com/jackson-serialize-dates @JsonFormatを使用するのが最も簡単な方法です。
public class Event {
public String name;
@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
public Date eventDate;
}
Varun Achar's answer に加えて、これは私が思いついたJava 8バリアントで、古いJava.util.Dateクラスの代わりにJava.time.LocalDateとZonedDateTimeを使用します。
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
@Override
public LocalDate deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException {
String string = jsonparser.getText();
if(string.length() > 20) {
ZonedDateTime zonedDateTime = ZonedDateTime.parse(string);
return zonedDateTime.toLocalDate();
}
return LocalDate.parse(string);
}
}