Форматирование даты в 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, как вы говорите.

Другие вопросы по тегам