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

Java中解析字符串为Date后如何按yyyy-MM-dd格式输出

问题本质

java.util.Date对象本身仅存储距离1970-01-01 00:00:00 UTC的毫秒级时间戳,不保存任何输出格式配置。直接打印Date对象时会自动调用类自带的toString()方法,该方法固定输出星期 月份缩写 日 时分秒 时区 年份格式的字符串,和解析时使用的SimpleDateFormat规则无关,因此无法直接得到yyyy-MM-dd格式的结果。

解决方案

方案1:兼容旧JDK版本(JDK7及更早)

解析得到Date对象后,不要直接打印对象本身,调用SimpleDateFormat的format()方法,将Date按照指定模式转换为目标格式的字符串再输出:

String inputDate ="1948-06-29";
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDate.parse(inputDate); 
// 按指定格式格式化Date对象为字符串
String output = simpleDate.format(date);
System.out.println("Output : " + output); // 输出:Output : 1948-06-29

注意:SimpleDateFormat是非线程安全类,多线程场景下禁止作为全局共享变量使用,否则会出现解析/格式化结果错误,建议每次使用时新建实例,或通过ThreadLocal做线程级隔离。

方案2:Java 8+ 官方推荐方案(优先使用)

Java 8 新增的java.time包彻底解决了旧日期API设计缺陷、线程不安全的问题,是目前官方推荐的日期处理方式。
针对仅需要处理年-月-日、不带时分秒的场景,可以直接使用LocalDate类,该类默认的toString()方法就采用yyyy-MM-dd格式输出,无需额外编写格式化规则即可满足需求:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class DateDemo {
    public static void main(String[] args) {
        String inputDate = "1948-06-29";
        // DateTimeFormatter是线程安全的,可定义为全局常量复用
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate localDate = LocalDate.parse(inputDate, formatter);
        // 直接打印即可得到yyyy-MM-dd格式结果
        System.out.println("Output : " + localDate); // 输出:Output : 1948-06-29
    }
}

如果后续需要其他输出格式,调用localDate.format(目标格式对应的DateTimeFormatter实例)即可得到对应格式的字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:42:28