我想实现一个线程安全的函数来从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中实现它。看来这种方式有点冗长。 我对此不满意。
答案 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过渡可能发生在午夜。 (巴西就是一个常见的例子。)
除非你真的与Date
和Calendar
结合,否则我建议您开始使用Joda Time,因为这样你就可以拥有类型为LocalDate
的值可以解决大部分问题。