Форматирование даты в Apache JsonToStringStyle
Я реализую методы toString для моих сущностей. Есть много полей типа ZonedDateTime. К сожалению, это преобразовано в чрезвычайно длинное текстовое представление:
java.util.GregorianCalendar[
time=1545826815293,
areFieldsSet=true,
areAllFieldsSet=true,
lenient=true,
zone=sun.util.calendar.ZoneInfo
[
id=
"UTC",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null
],
firstDayOfWeek=1,
minimalDaysInFirstWeek=1,
ERA=1,
YEAR=2018,
MONTH=11,
WEEK_OF_YEAR=52,
WEEK_OF_MONTH=5,
DAY_OF_MONTH=26,
DAY_OF_YEAR=360,
DAY_OF_WEEK=4,
DAY_OF_WEEK_IN_MONTH=4,
AM_PM=1,
HOUR=0,
HOUR_OF_DAY=12,
MINUTE=20,
SECOND=15,
MILLISECOND=293,
ZONE_OFFSET=0,
DST_OFFSET=0
]
Как я могу отформатировать его с помощью SimpleDateFormat? Я пробовал приведенный здесь пример: https://howtodoinjava.com/apache-commons/how-to-override-tostring-effectively-with-tostringbuilder/
public class CustomToStringStyle extends ToStringStyle
{
private static final long serialVersionUID = 1L;
protected void appendDetail(StringBuffer buffer, String fieldName, Object value)
{
if (value instanceof Date)
{
value = new SimpleDateFormat("yyyy-MM-dd").format(value);
}
buffer.append(value);
}
}
Но в этом случае я не использую стиль форматирования JSON. Я не могу расширить JsonToStringStyle, потому что это личное.
2 ответа
GregorianCalendar
не является Date
, вы можете преобразовать его в Date
, а затем используйте код в вашей ссылке:
if (value instanceof calendar)
{
Date date = new Date(value.getTimeInMillis());
value = new SimpleDateFormat("yyyy-MM-dd").format(date);
}
Я бы предложил использовать java.time
пакет, чтобы иметь дело с датой и временем.
ZonedDateTime является частью нового API Java 8, в то время как SimpleDateFormat является старым ошибочным форматером Date. Вам нужно использовать новый DateFormatter для Java 8 классов даты / времени.
JSON, который вы опубликовали, однако, не является ни ZonedDateTime, ни Date, это GregorianCalendar, поэтому не уверен, действительно ли ваша проблема связана с ZonedDateTime, как вы говорите.