Как преобразовать формат даты в другой шаблон в Java - PullRequest
1 голос
/ 16 марта 2020

Я хочу преобразовать формат даты из этого EEE MMM dd HH:mm:ss zzz yyyy

в лайк yyyy-MM-dd

это мои данные json точно известно из redis

{
   "bannerId":4,
   "bannerName":"banner test test 2 123"
   "startDate":"Mon Sep 02 00:00:00 WIB 2019",
   "endDate":"Sat Sep 28 00:00:00 WIB 2019"
}

и я хочу преобразовать startDate и endDate как json ниже

и json выход, который я хочу

{
   "bannerId":4,
   "bannerName":"banner test test 2 123"
   "startDate":"2019-09-02",
   "endDate":"2019-09-28"
}

до сих пор я пробовал это, но не смог .. показать ошибку, как это failed Unparseable date: \"2019-09-02\

.

и это мой код

Баннер. java

@Getter @Setter @NoArgsConstructor
public class Banner {

    private Integer bannerId;
    private String bannerName;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd HH:mm:ss zzz yyyy", timezone = "Asia/Jakarta")
    private Date startDate;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd HH:mm:ss zzz yyyy", timezone = "Asia/Jakarta")
    private Date endDate;
}

BannerController. java

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
listRedis = bannerService.loadBannerRedis(Constant.DVC_BANNER_MOBILE, Constant.LOC_BANNER_HOME, Constant.PST_BANNER_MAIN);
    for (Banner banner : listRedis) {

         banner.setStartDate(
              new SimpleDateFormat("yyyy-MM-dd").parse(
                  Convert.convertDate(dateFormat.format(banner.getStartDate()))));
    }

Конвертировать. java

public static String convertDate(String dd) throws ParseException {
        DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
        Date date = (Date)formatter.parse(dd);     

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        String formatedDate = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DATE);
        return formatedDate;
}

Итак, мне нужно решение, что я должен делать ??

Ответы [ 2 ]

1 голос
/ 17 марта 2020

tl; др

ZonedDateTime
        .parse(
                "Mon Sep 02 00:00:00 WIB 2019" ,
                DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US )
        )
        .toLocalDate()

2019-09-02

Table of all date-time types in Java, both modern and legacy

java .time

Вы используете ужасные классы даты и времени, которые были годами go, вытесненными современными java .time классами, определенными в JSR 310.

Определите шаблон форматирования в соответствии с вашим вводом. Укажите Locale, чтобы определить человеческий язык и культурные нормы для использования при разборе названия месяца, названия дня и т. Д.

String input = "Mon Sep 02 00:00:00 WIB 2019";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , locale );

Parse.

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

Dump на консоль, используя стандартный формат ISO 8601 для сгенерированного текста, разумно расширяя стандарт, добавляя название часового пояса в квадратных скобках.

System.out.println( "zdt = " + zdt );

zdt = 2019-09-02T00: 00+ 07:00 [Азия / Джакарта]

Требуется только дата, без времени суток и без часового пояса.

Но вы должны понимать, что в любой данный момент дата меняется по всему миру в зависимости от часового пояса. Так что в любой момент это может быть «завтра» в Токио, Япония, тогда как в «Толедо, Огайо, США» все еще «вчера».

Хотите ли вы дату, показанную в Индонезии?

LocalDate ld = zdt.toLocalDate() ;

Или вы хотите, чтобы дата отображалась в UT C?

LocalDate ld = 
    zdt
    .toOffsetDateTime()
    .withOffsetSameInstant( ZoneOffset.UTC )
    .toLocalDate() 
;

Затем сгенерируйте желаемую выходную строку, формат которой соответствует используемому стандартному формату ISO 8601 по умолчанию в LocalDate::toString.

String output = ld.toString() ;

Совет. Сообщите издателю свои данные о:

  • Стандарте ISO 8601 , определяющем форматы даты и времени использовать при обмене значениями даты и времени в виде текста.
  • Мудрость общего сообщения моментов в UT C (смещение нуля часов-минут-секунд), а не в конкретное время zone.
  • Имена зон реального времени имеют формат Continent/Region, , а не 2-4-буквенные псевдозоны, такие как WIB, CST или IST.
1 голос
/ 17 марта 2020

вы можете использовать LocalDateTime для этого, вам следует избегать использования устаревших Date класс

 String str = "Mon Sep 02 00:00:00 WIB 2019";
            LocalDateTime parse = LocalDateTime.parse(str, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"));
            System.out.println(parse);
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            String format = parse.format(dateTimeFormatter);
            System.out.println(format);  
            // out-put 2019-09-02

Вы также можете использовать то же самое на @JsonFormat(pattern = "yyyy-MM-dd")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...