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

Java中java.util.Date类型日期格式转换问题求助

嘿,这个问题我之前也碰到过,得先给你理清一个关键概念:java.util.Date其实本质上是个时间戳——它存储的是从1970年1月1日0点以来的毫秒数,本身并没有“格式”一说。你看到的Sat Jan 20 00:00:00 IST 2018只是它toString()方法默认输出的格式,而2018-01-20也只是另一种字符串表示形式。

你想要的“输出java.util.Date类型的2018-01-20”,本质上是要把原Date对象的时间部分(时、分、秒、毫秒)全部清零,得到一个代表当天零点的Date对象。这样不管后续怎么展示,它对应的都是你要的日期。

下面给你两种方案,优先推荐Java 8+的新API,因为旧的Date/Calendar类坑太多:

Java 8+ 推荐方案

Java 8引入的java.time包(JSR-310)是专门为解决旧日期API的问题设计的,线程安全且逻辑清晰。我们可以借助它先提取日期部分,再转换回java.util.Date:

import java.util.Date;
import java.time.LocalDate;
import java.time.ZoneId;

public class DateConverter {
    public static void main(String[] args) {
        // 你的输入Date对象
        Date inputDate = new Date(1516387200000L); // 对应Sat Jan 20 00:00:00 IST 2018
        
        // 1. 将Date转换为LocalDate(仅保留日期,自动丢弃时间部分)
        // 注意:这里要指定时区,避免跨时区日期偏移,比如印度时区用ZoneId.of("Asia/Kolkata")
        LocalDate localDate = inputDate.toInstant()
                                       .atZone(ZoneId.systemDefault()) // 用系统默认时区,或指定具体时区
                                       .toLocalDate();
        
        // 2. 将LocalDate转换回Date,时间设为当天零点
        Date outputDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
        
        // 输出结果:Sat Jan 20 00:00:00 IST 2018(时间部分已清零)
        System.out.println(outputDate);
    }
}
旧API兼容方案(Java 7及以下)

如果还在使用旧版本Java,只能用Calendar类来手动清零时间部分:

import java.util.Date;
import java.util.Calendar;

public class OldDateConverter {
    public static void main(String[] args) {
        Date inputDate = new Date(1516387200000L);
        
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(inputDate);
        
        // 手动清零时间部分
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        
        Date outputDate = calendar.getTime();
        
        // 输出结果:Sat Jan 20 00:00:00 IST 2018
        System.out.println(outputDate);
    }
}

重要提醒

  • 永远不要试图让java.util.Date直接“存储”2018-01-20这种格式——它做不到,因为它本质是毫秒数。你能做的就是让它指向当天的零点,后续如果需要输出2018-01-20的字符串格式,再用SimpleDateFormat(旧API)或DateTimeFormatter(新API)来格式化。
  • 时区一定要注意!不同时区的“当天零点”可能相差一天,转换时务必指定正确的时区,避免出现日期偏移的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:27:23