我如何在Java中得到一个没有时间的日期?

546165 次浏览

最直接的方法:

long millisInDay = 60 * 60 * 24 * 1000;
long currentTime = new Date().getTime();
long dateOnly = (currentTime / millisInDay) * millisInDay;
Date clearDate = new Date(dateOnly);

你绝对使用java.util.Date吗?我将彻底建议你使用Joda的时间或Java 8中的java.time包代替。特别地,Date和Calendar 总是表示一个特定的时刻,没有“只是一个日期”这样的概念,Joda time 有一个类型表示这个(LocalDate)。如果您能够使用代表您实际要做的事情的类型,那么您的代码将更加清晰。

使用Joda Time或java.time而不是内置的java.util类型还有很多很多其他原因——它们通常是更好的api。如果你需要,你总是可以在你自己的代码边界上从java.util.Date转换到java.util.Date,例如用于数据库交互。

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

当然,你可以把method2中的逻辑放到一个helper类的静态函数中,就像在tobeginningoftheday方法中那样

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

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

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

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

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

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

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

LocalDate d = new LocalDate();

更新::使用java 8这可以通过使用

LocalDate date = LocalDate.now();

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

下面是我过去用时间设置为00:00:00来获取今天的日期:

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


Date today = new Date();


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

如果您需要日期部分只是为了重复的目的,那么

Date d = new Date();
String dateWithoutTime = d.toString().substring(0, 10);

尽量不使用第三方库。我知道之前提到过这种方法,但这里有一种干净的方法:

  /*
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可能是一种选择!

你可以使用Apache Commons库中的DateUtils.truncate

例子:

DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)

绝对不是最正确的方法,但如果你只是需要一个快速的解决方案来获得日期而不需要时间,你不希望使用第三方库,这应该做

    Date db = db.substring(0, 10) + db.substring(23,28);

我只是为了视觉目的而需要日期,不能Joda,所以我添加了子字符串。

这是一种简单的方法:

Calendar cal = Calendar.getInstance();
SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateOnly.format(cal.getTime()));

如果你想要的只是看到像“YYYY-MM-DD”这样的日期,而没有其他乱七八糟的东西。“Thu May 21 12:08:18 EDT 2015”然后只使用java.sql.Date。下面的例子获取当前日期:

new java.sql.Date(System.currentTimeMillis());

而且java.sql.Datejava.util.Date的子类。

博士tl;

除了这两种,还有别的办法吗?

是的,有:LocalDate.now

LocalDate.now(
ZoneId.of( "Pacific/Auckland" )
)

java.time

Java 8及以后的版本内置了新的java。时间包。看到教程。大部分的java。时间功能向后移植到Java 6 &ThreeTen-Backport中的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

< em > java.time < / em >框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗产日期-时间类,如java.util.DateCalendar, &SimpleDateFormat

现在在维护模式中的< em > Joda-Time < / em >项目建议迁移到java.time类。

要了解更多信息,请参见< < em >甲骨文教程/ em >。搜索Stack Overflow可以找到很多例子和解释。规格是JSR 310

从哪里获取java。时间类?

< >强ThreeTen-Extra < / >强项目扩展了java。额外的课程时间。这个项目是未来可能添加到java.time的一个试验场。你可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多的

充分利用Java巨大的时区数据库的最直接的方法是正确的:

long currentTime = new Date().getTime();
long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);
// 09/28/2015
System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));


// Mon Sep 28
System.out.println( new Date().toString().substring(0, 10) );


// 2015-09-28
System.out.println(new java.sql.Date(System.currentTimeMillis()));


// 2015-09-28
// java 8
System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

如果你只需要当前日期,不需要时间,另一种选择是:

DateTime.now().withTimeAtStartOfDay()

这是一个干净的解决方案,没有转换到字符串和返回,而且它不会重新计算时间几次,因为你重置时间的每个组件为零。它还使用%(模量)而不是除后乘,以避免重复操作。

它不需要第三方依赖,并且它尊重传入的calendar对象的TIMEZONE。此函数返回您传入的日期(Calendar)所在时区的上午12点的时间点。

public static Calendar date_only(Calendar datetime) {
final long LENGTH_OF_DAY = 24*60*60*1000;
long millis = datetime.getTimeInMillis();
long offset = datetime.getTimeZone().getOffset(millis);
millis = millis - ((millis + offset) % LENGTH_OF_DAY);
datetime.setTimeInMillis(millis);
return datetime;
}

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

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

你可以利用joda时间。

private Date dateWitoutTime(Date date){
return new LocalDate(date).toDate()
}

你打电话说:

Date date = new Date();
System.out.println("Without Time = " + dateWitoutTime(date) + "/n  With time = " + date);

这个呢?

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();
}

我刚为我的应用程序做了这个:

public static Date getDatePart(Date dateTime) {
TimeZone tz = TimeZone.getDefault();
long rawOffset=tz.getRawOffset();
long dst=(tz.inDaylightTime(dateTime)?tz.getDSTSavings():0);
long dt=dateTime.getTime()+rawOffset+dst; // add offseet and dst to dateTime
long modDt=dt % (60*60*24*1000) ;


return new Date( dt
- modDt // substract the rest of the division by a day in milliseconds
- rawOffset // substract the time offset (Paris = GMT +1h for example)
- dst // If dayLight, substract hours (Paris = +1h in dayLight)
);
}

Android API级别1,没有外部库。 它尊重日光和默认时区。没有字符串操作,所以我认为这种方式比你的CPU效率更高,但我没有做任何测试

我们可以使用SimpleDateFormat来设置日期的格式。下面是一个工作示例:-

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(dateFormat.format(new Date())); //data can be inserted in this format function

输出:

15/06/2021