更改日期格式

Changing date formats

我有以下代码:

// OLD DATE
String date = "Mon, 06/07";

DateFormat df = new SimpleDateFormat("MM/dd");
String strDate = date.substring(date.length() - 5);
Date dateOld;
try {
    dateOld = df.parse(strDate);
} catch (Exception e) {
    e.printStackTrace();
}
String dateStr = df.format(dateOld);
MonthDay monthDay = MonthDay.parse(dateStr, DateTimeFormatter.ofPattern("MM/dd"));
ZonedDateTime dateNew = ZonedDateTime.now().with(monthDay);

// NEW DATE
System.out.println(dateNew.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T00:00:00Z'")));

基本上我想要做的是将 Mon, 06/07 格式更改为这种格式 2021-06-07T00:00:00Z

我有什么用,但真的很糟糕。更好的方法是什么?

这有点棘手,因为您需要做出一些假设

  • 年份,因为它在原始格式中没有指定
  • TimeZone,因为它根本没有指定(最终输出似乎指向 UTC)

您需要做的第一件事是将 String 输入解析为 LocalDate(您可以直接转到 ZonedDate,但这是我开始的地方)

String date = "Mon, 06/07";
DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
        .appendPattern("E, M/d")
        .parseDefaulting(ChronoField.YEAR, 2021)
        .toFormatter(Locale.US);

LocalDate ld = LocalDate.parse(date, parseFormatter);

然后您需要将其转换为 LocalDateTime

LocalDateTime ldt = ld.atStartOfDay();

然后,到了ZonedDateTime。在这里,我假设 UTC

//ZoneId zoneId = ZoneId.systemDefault();
//ZonedDateTime zdt = ldt.atZone(zoneId);
OffsetDateTime zdt = ldt.atOffset(ZoneOffset.UTC);

最后,将结果格式化为您想要的格式

String formatted = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
System.out.println(formatted);

对我来说,打印...

2021-06-07T00:00:00Z

新的 Date/Time API 投入了大量时间和精力,您应该抽出时间尝试并尽可能地学习它们(我很生疏,但稍加修修补补,得到结果)

也许从 Date/Time trails

开始

解决方案使用 CalendarDateSimpleDateFormat

    SimpleDateFormat sdf = new SimpleDateFormat("EEE, MM/dd", Locale.getDefault());
    try {
        Date oldDate = sdf.parse("Mon, 06/07");
        Calendar calendar = Calendar.getInstance();
        int savedYear = calendar.get(Calendar.YEAR);

        if (oldDate != null) {
            calendar.setTime(oldDate);
            calendar.set(Calendar.YEAR, savedYear);
            sdf.applyPattern("yyyy-MM-dd'T00:00:00Z'");
            System.out.println(sdf.format(calendar.getTime()));
        }
    } catch (ParseException e) {
        e.printStackTrace();
    }