You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用SimpleDateFormat/Joda转换日期字符串后格式不符

问题解决:日期字符串转Date后格式不符的问题

你遇到的核心问题是:Date(或Joda的DateTime)对象本身并不存储格式信息,它只是表示一个时间点。当你直接打印这类对象时,调用的是它的toString()方法,该方法会默认输出包含时区、时间的完整格式(比如Thu Aug 01 00:00:00 EDT 2019),这是API的默认行为,无法通过修改转换模式改变。

解决方案分两种场景:

场景1:需要日期对象用于计算(而非仅显示格式)

推荐使用Java 8+引入的LocalDate类(无时区、仅存年月日,比旧Date类更贴合你的需求),结合DateTimeFormatter完成转换:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

public class DateConvertDemo {
    public static void main(String[] args) {
        List<String> dateStrList = List.of("Apr 1, 2019", "Aug 1, 2020", "Feb 20, 2018");
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d, yyyy");

        // 转换为LocalDate对象(可用于日期比较、加减等操作)
        List<LocalDate> localDateList = dateStrList.stream()
                .map(str -> LocalDate.parse(str, formatter))
                .collect(Collectors.toList());

        // 若需要输出原格式的字符串,再次格式化即可
        List<String> formattedStrList = localDateList.stream()
                .map(date -> date.format(formatter))
                .collect(Collectors.toList());

        // 打印LocalDate对象默认是ISO格式(yyyy-MM-dd)
        localDateList.forEach(System.out::println);
        // 打印格式化后的字符串则为原格式
        formattedStrList.forEach(System.out::println);
    }
}

场景2:坚持使用旧版java.util.Date类

如果必须用Date,想要得到原格式的文本,需要在转换为Date对象后,再次用SimpleDateFormat格式化回字符串:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class OldDateDemo {
    public static void main(String[] args) throws ParseException {
        List<String> dateStrList = List.of("Apr 1, 2019", "Aug 1, 2020", "Feb 20, 2018");
        SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy");

        List<Date> dateList = new ArrayList<>();
        for (String str : dateStrList) {
            dateList.add(sdf.parse(str));
        }

        // 转换回原格式字符串
        List<String> formattedStrList = new ArrayList<>();
        for (Date date : dateList) {
            formattedStrList.add(sdf.format(date));
        }

        // 直接打印Date会输出默认长格式
        dateList.forEach(System.out::println);
        // 打印格式化后的字符串才是原格式
        formattedStrList.forEach(System.out::println);
    }
}

关键提醒

  • 旧版SimpleDateFormat存在线程安全问题,多线程环境下容易出问题,优先使用Java 8+的DateTimeFormatter。
  • 永远记住:日期对象存储的是时间点,格式只是字符串的展示方式,不要混淆两者的作用。

内容的提问来源于stack exchange,提问作者Gunel Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:03:12