继续从堆栈溢出问题Java程序,以获得当前日期没有时间戳:

获得Date对象而不包含时间的最有效方法是什么?除了这两种,还有别的办法吗?

// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));

// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();

更新:

我知道Joda-Time;我只是试图避免额外的库为这样一个简单的(我认为)任务。但根据目前的回答,Joda-Time似乎非常受欢迎,所以我可能会考虑一下。 通过高效,我的意思是我想避免像方法1所使用的那样创建临时对象字符串,同时方法2似乎是一种hack而不是解决方案。


当前回答

据我所知,如果只使用标准JDK,就没有更简单的方法来实现这一点。

当然,您可以将method2中的逻辑放到一个helper类中的静态函数中,就像这里在tobeginningoftheday方法中所做的那样

然后你可以把第二种方法缩短为:

Calendar cal = Calendar.getInstance();
Calendars.toBeginningOfTheDay(cal);
dateWithoutTime = cal.getTime();

或者,如果您确实经常需要这种格式的当前日期,那么您可以用另一个静态帮助器方法将其包装起来,从而使其成为一行程序。

其他回答

这些问题的标准答案是使用Joda Time。API更好,如果使用格式化器和解析器,可以避免SimpleDateFormat缺乏线程安全性的问题。

使用Joda意味着你可以简单地做:

LocalDate d = new LocalDate();

更新::使用java 8这可以实现使用

LocalDate date = LocalDate.now();

对于标准java运行时中的date例程,谈论没有时间戳的日期是没有意义的,因为它实际上映射到特定的毫秒而不是日期。所述毫秒本质上有一个时间附加到它,这使得它容易受到时区问题,如日光节约时间和其他日历调整。看看为什么这两次减去(1927年)会得到一个奇怪的结果?举个有趣的例子。

如果您希望使用日期而不是毫秒,则需要使用其他东西。对于Java 8,有一组新的方法可以提供您想要的东西。对于Java 7及更早版本,请使用http://www.joda.org/joda-time/

使用LocalDate.now()并转换为Date,如下所示:

Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());

以下是我过去把时间设置为00:00:00的今天日期:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

Date today = new Date();

Date todayWithZeroTime = formatter.parse(formatter.format(today));

看看Veyder-time。它是一个简单而有效的java的替代品。util和joda时间。它有一个直观的API和只表示日期的类,没有时间戳。