これは、私が予想していたよりも難しいことが判明しました。
public class TicksSinceFormat extends DateFormat {
@Override
public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) {
long millis = date.getTime();
return new StringBuffer("/Date(" + millis + ")/");
}
@Override
public Date parse(String string, ParsePosition position) {
int start = string.indexOf("(") + 1;
int end = string.indexOf(")");
String ms = string.substring(start, end);
Date date = new Date(Long.parseLong(ms));
position.setIndex(string.length() - 1); // MUST SET THIS
return date;
}
@Override
public Object clone() {
return new TicksSinceFormat(); // MUST SET THIS
}
}
クラスの使用は非常に簡単です。
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new TicksSinceFormat())
これはより適切にコーディングできると思います + .NET Ticks VS Java ticks に関しては違いに対処する必要がありますが、今のところはこれで十分です。誰かがより良い解決策を持っているか、言及された問題についてより多くの洞察を持っている場合は、後で対処します-お気軽に投稿してください。より良い場合は、あなたの答えを正しいものとしてマークします.
編集: この質問と回答で説明したように、サーバー上の ServiceStack.Text ライブラリに切り替えましたが、別の ISO8601 形式が返されます。その形式では、少し異なる解析を使用しています (Jackson はミリ秒を含む ISO8601 の解析に問題があるため)。もちろん、私が投稿している他のコードと同様に、より良いバージョンがあれば教えてください (どのように行うべきかについて哲学的なレトリックに頼るのではなく、コードを投稿するか、この投稿を編集してください):
@SuppressLint("SimpleDateFormat")
public class JacksonSimpleDateFormat extends SimpleDateFormat {
public JacksonSimpleDateFormat() {
if (mParser == null) {
mParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
mParser.setTimeZone(TimeZone.getTimeZone("UTC"));
}
}
@Override
public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) {
return mParser.format(date, buffer, field);
}
private static SimpleDateFormat mParser;
@Override
public Date parse(String string, ParsePosition position) {
String str = string.split("\\.")[0];
Date date = null;
try {
date = mParser.parse(str);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
position.setIndex(string.length() - 1);
return date;
}
@Override
public Object clone() {
return new JacksonSimpleDateFormat();
}
}