如何在Java中没有时间获取日期?

时间:2011-02-19 10:15:32

标签: java date

继续Stack Overflow问题 Java program to get the current date without timestamp

什么是没有时间获取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();

更新

  1. 我知道Joda-Time;我只是想为这么简单(我认为)的任务避免使用额外的库。但基于迄今为止的答案,Joda-Time似乎非常受欢迎,所以我可能会考虑它。

  2. 通过高效,我的意思是我想避免String使用的临时对象method 1创建,同时method 2似乎是黑客而已解决方案。

23 个答案:

答案 0 :(得分:102)

你绝对 使用java.util.Date吗?我彻底建议您使用来自Java 8的Joda Timejava.time包。特别是,虽然日期和日历总是代表一个特定的时刻,没有“只是一个日期”的概念,Joda Time 有一个代表这个的类型({ {1}})。如果您能够使用代表您实际尝试的类型,那么您的代码将更加清晰。

使用Joda Time或LocalDate而不是内置java.time类型有很多其他原因 - 它们通常是更好的API。如果需要,您可以随时在自己代码的边界转换为java.util /从java.util.Date转换。用于数据库交互。

答案 1 :(得分:58)

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

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

Date today = new Date();

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

答案 2 :(得分:51)

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

示例:

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

答案 3 :(得分:32)

  

除了这两个还有其他方法吗?

是的,有。

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

java.time

Java 8及更高版本附带了新的java.time package内置版本。见Tutorial。许多java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

Joda-Time类似,java.time提供了一个LocalDate类来表示没有时间且没有时区的仅限日期的值。

请注意,确定特定日期的时区非常重要。例如,在巴黎的午夜时分,蒙特利尔的日期仍然是“昨天”。

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 4 :(得分:22)

最直接的方式:

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

答案 5 :(得分:21)

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

使用Joda意味着你可以做到:

LocalDate d = new LocalDate();

更新:: 使用java 8可以使用

实现
LocalDate date = LocalDate.now();

答案 6 :(得分:7)

这是一种简单的方法:

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

答案 7 :(得分:7)

关于标准java运行时中的Date例程,没有时间戳的日期是没有意义的,因为它本质上映射到特定的毫秒而不是日期。所述毫秒本身具有与其相关的时间,这使得它易受诸如夏令时和其他日历调整之类的时区问题的影响。有关有趣的示例,请参阅Why is subtracting these two times (in 1927) giving a strange result?

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

答案 8 :(得分:4)

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

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

我只是为了视觉目的而需要日期而且不能让Joda这样我被收购。

答案 9 :(得分:3)

如果您只想看到日期如此“YYYY-MM-DD”而没有其他所有混乱,例如“2015年5月21日星期二12:08:18”,然后使用java.sql.Date。此示例获取当前日期:

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

同样java.sql.Datejava.util.Date的子类。

答案 10 :(得分:3)

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

当然,您可以将method2中的逻辑放入辅助类中的静态函数中,例如done here in the toBeginningOfTheDay-method

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

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

或者,如果您确实需要这种格式的当前日期,那么您可以将其包装在另一个静态辅助方法中,从而使其成为单行。

答案 11 :(得分:2)

如果你需要日期部分只是为了回应目的,那么

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

答案 12 :(得分:2)

// 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

答案 13 :(得分:2)

如果您只是需要当前日期,没有时间,另一个选项是:

DateTime.now().withTimeAtStartOfDay()

答案 14 :(得分:2)

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

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

答案 15 :(得分:1)

结帐Veyder-time。它是java.util和Joda-time的简单而有效的替代方案。它有一个直观的API和仅代表日期的类,没有时间戳。

答案 16 :(得分:1)

充分利用庞大的TimeZone数据库Java的最直接的方法是正确的:

long currentTime = new Date().getTime();
long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);

答案 17 :(得分:1)

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

它不需要第三方依赖项,并且它会传递传入的日历对象的时区。此函数返回您传入的日期(日历)时区的上午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;
}

答案 18 :(得分:1)

那呢?

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

答案 19 :(得分:0)

不希望尽可能多地使用第三方库。我知道以前提到过这种方式,但这里有一个很好的清洁方式:

  /*
    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;
}

好吧,不使用GregorianCalendar可能是一个选择!

答案 20 :(得分:0)

哟可以使用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);

答案 21 :(得分:0)

我刚刚为我的应用制作了此图片:

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,没有外部库。 它尊重日光和默认timeZone。没有字符串操作,因此我认为这种方式比您的CPU效率更高,但我尚未进行任何测试。

答案 22 :(得分:0)

我们可以使用 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