này được chứng minh là khó khăn hơn sau đó tôi mong đợi:
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
}
}
Sử dụng lớp là sau đó cực kỳ đơn giản, chỉ cần làm:
ObjectMapper om = new ObjectMapper();
om.setDateFormat(new TicksSinceFormat())
Tôi đoán rằng điều này có thể được mã hóa tốt hơn + rằng tôi sẽ cần phải đối phó với sự khác biệt khi nói đến .NET Ticks VS Java ticks - nhưng bây giờ điều này sẽ d o. Nếu ai đó có giải pháp tốt hơn hoặc thông tin chi tiết hơn về các vấn đề được đề cập, tôi sẽ xử lý sau - cảm thấy tự do để đăng và tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời đúng nếu nó tốt hơn.
EDIT: Như tôi đã giải thích trong số này question & answer Tôi đã chuyển sang thư viện ServiceStack.Text trên máy chủ và nó trả về định dạng ISO8601 khác nhau. Đối với định dạng đó, tôi đang sử dụng phân tích cú pháp hơi khác (vì Jackson gặp sự cố khi phân tích cú pháp ISO8601 có chứa mili giây). Tất nhiên, như với mã khác tôi đăng - hãy cho tôi biết nếu bạn có phiên bản tốt hơn (chỉ cần đăng mã/chỉnh sửa bài đăng này, thay vì sử dụng từ ngữ triết học về cách thực hiện):
@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();
}
}
Có vẻ như mã của bạn sẽ hoạt động tốt ... thay đổi duy nhất tôi thực hiện là sử dụng nhóm chụp RegEx trong phương thức 'parse' của bạn , thay vì string.indexOf/string.substring. Đây chỉ là một điều phong cách ... Tôi đã luôn luôn tìm thấy string.indexOf/substring được hơi giòn và khó khăn để làm việc với liên quan đến chỉ số/chiều dài. Chỉ là ý kiến khiêm nhường của tôi. –
@PhilipTenn Chăm sóc để cung cấp cho tôi một mã Regex & mã mạnh mẽ sẽ hoạt động chắc chắn? – kape123