继续从堆栈溢出问题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而不是解决方案。
尽量不使用第三方库。我知道之前提到过这种方法,但这里有一种干净的方法:
/*
Return values:
-1: Date1 < Date2
0: Date1 == Date2
1: Date1 > Date2
-2: Error
*/
public int compareDates(Date date1, Date date2)
{
SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
try
{
date1 = sdf.parse(sdf.format(date1));
date2 = sdf.parse(sdf.format(date2));
}
catch (ParseException e) {
e.printStackTrace();
return -2;
}
Calendar cal1 = new GregorianCalendar();
Calendar cal2 = new GregorianCalendar();
cal1.setTime(date1);
cal2.setTime(date2);
if(cal1.equals(cal2))
{
return 0;
}
else if(cal1.after(cal2))
{
return 1;
}
else if(cal1.before(cal2))
{
return -1;
}
return -2;
}
好吧,不使用gregoricalendar可能是一种选择!
博士tl;
除了这两种,还有别的办法吗?
是的,有:LocalDate.now
LocalDate.now(
ZoneId.of( "Pacific/Auckland" )
)
java.time
Java 8和更高版本的新Java。时间包内置。看教程。大部分的java。时间功能在ThreeTen-Backport中向后移植到Java 6和7,并在ThreeTenABP中进一步适应Android。
类似于Joda-Time, java。time提供了一个LocalDate类来表示一个只包含日期的值,不包含日期和时区。
请注意,时区对于确定特定的日期非常重要。例如,在巴黎午夜钟声敲响时,Montréal上的日期仍然是“昨天”。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
默认为java。time使用ISO 8601标准生成日期或日期-时间值的字符串表示形式。(与Joda-Time的另一个相似之处。)因此,只需调用toString()来生成类似2015-05-21的文本。
String output = today.toString() ;
关于java.time
java。时间框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期-时间类,如java.util。日期,日历和简单日期格式。
Joda-Time项目现在处于维护模式,建议迁移到java。时间类。
要了解更多,请参阅Oracle教程。搜索Stack Overflow可以找到很多例子和解释。规范是JSR 310。
从哪里获取java。时间类?
Java SE 8、Java SE 9以及更高版本
内置的。
带有捆绑实现的标准Java API的一部分。
Java 9增加了一些小特性并进行了修复。
Java SE 6和Java SE 7
大部分的java。时间功能在ThreeTen-Backport中向后移植到Java 6和7。
安卓
后续版本的Android捆绑实现的java。时间类。
对于早期的Android, ThreeTenABP项目适应了ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP....
ThreeTen-Extra项目扩展了java。额外的课程时间。这个项目是未来可能添加到java.time的一个试验场。你可以在这里找到一些有用的类,比如Interval、YearWeek、YearQuarter等等。
这个呢?
public static Date formatStrictDate(int year, int month, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, dayOfMonth, 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}