Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java.util.Date中删除时间部分的正确方法是什么?_Java_Date - Fatal编程技术网

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

从java.util.Date中删除时间部分的正确方法是什么?,java,date,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 ret

我想实现一个线程安全函数,从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实现它。这种方式似乎有点冗长。
我对此不满意。

一个
Date
对象包含一个变量,该变量将时间表示为自该对象以来的毫秒数。所以,你不能“删除”时间部分。你能做的就是把那天的时间设置为零,这意味着那天的时间是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();

Date
包含时间上的一个瞬间,这意味着它不会明确指定特定的日期。所以你也需要指定一个时区,以便计算出某物落在哪一天。然后,您需要计算出您想要如何表示结果-例如,使用值为“UTC中该日期的午夜”的
日期

您还应该注意,由于DST转换可能发生在午夜,所以午夜本身并不是在所有时区的所有日子都发生。(巴西就是一个常见的例子。)


除非你真的很喜欢日期和日历,否则我建议你改用日历,因为这样可以让你有一个类型为LocalDate的值,它可以解决大多数问题。

可能这只是我的问题,但我更喜欢日历而不是gregorianalendar。请注意,时区很重要,在那个时区可能不存在午夜。。。看看我的答案。@JonSkeet:我不太熟悉时区。将时区指定为构造函数参数是否足够?@MartijnCourteaux:是的,这很好-但是OP需要决定他们感兴趣的时区。此外,如果将本地时间设置为午夜,则可能会导致该时间无效。这只是一个旁白,但通常不明智的做法是保留对的DateFormat的静态引用。你是对的。我在知道它需要线程安全后更改了它。它已经在使用日期。所以我不能更改为Joda Time。我猜在我的用法中,它不需要如此精确。只要日期部分在其本地时间中正确计算。那没关系。@ClarkBao:但这就是问题所在-你需要指定你所指的时区。。。如果您尝试将日历设置为无效值,则在调用
getTime
时很可能会失败。如果你正在做大量的日期工作,你一定要考虑改变一切到JoDA时间-这是一个更好的API.输入日期通常是新的数据()。会有问题吗?我发现结果与上面的日历方式的日期格式方式相同。最终日期targetDate=新日期();系统输出打印项次(targetDate);最终GregorianCalendar cal=新的GregorianCalendar();校准设置时间(目标日期);System.out.println(cal.getTime());我发现这两个是一样的。@ClarkBao:那只是利用了当前的时间。但是你需要弄清楚你想把那个日期变成一个日期。