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
相关产品推荐
相关产品推荐

