从java.util.Date中删除时间部分的正确方法是什么?

时间:2011-10-15 11:27:33

标签: java date

我想实现一个线程安全的函数来从java.util.Date中删除时间部分。

我试过这种方式

private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
public static Date removeTimeFromDate(Date date) {
        Date returnDate = date;

        if (date == null) {
            return returnDate;
        }

        //just have the date remove the time
        String targetDateStr = df.format(date);
        try {
            returnDate = df.parse(targetDateStr);
        } catch (ParseException e) {
        }

        return returnDate;
}

并使用synchronized或threadLocal使其成为线程安全的。 但它有更好的方法在Java中实现它。看来这种方式有点冗长。 我对此不满意。

2 个答案:

答案 0 :(得分:9)

Date对象包含一个变量,它将时间表示为自epoch以来的毫秒数。所以,你不能“删除”时间部分。您可以做的是将当天的时间设置为零,这意味着它将是当天的00:00:00 000。这是通过使用GregorianCalendar:

完成的
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(date);
gc.set(Calendar.HOUR_OF_DAY, 0);
gc.set(Calendar.MINUTE, 0);
gc.set(Calendar.SECOND, 0);
gc.set(Calendar.MILLISECOND, 0);
Date returnDate = gc.getTime();

答案 1 :(得分:4)

Date及时拥有即时 - 这意味着它无法明确指定特定日期。所以你需要指定一个时区以及,以便计算出某些日期。然后,您需要弄清楚如何表示结果 - 例如,Date的值为“UTC中该日期的午夜”?

您还应注意,午夜本身不会在所有时区的所有日子里发生,因为DST过渡可能发生在午夜。 (巴西就是一个常见的例子。)

除非你真的DateCalendar结合,否则我建议您开始使用Joda Time,因为这样你就可以拥有类型为LocalDate的值可以解决大部分问题。