事实证明这比我预期的要难:
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 滴答时,我需要处理差异 - 但现在就可以了。如果有人对提到的问题有更好的解决方案或更深入的了解,我稍后会处理 - 请随时发布,如果更好,我会将您的答案标记为正确的答案。
编辑:正如我在这个问题和答案中解释的那样,我已经切换到服务器上的 ServiceStack.Text 库,它返回不同的 ISO8601 格式。对于那种格式,我使用了稍微不同的解析(因为杰克逊在解析包含毫秒的 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();
}
}