如何将java.util.Date实例的时间设置为00:00:00?

时间:2013-12-06 01:34:54

标签: java date

我有一个java.util.Date类型的变量。

如何将时间部分设置为00:00:00?

我不允许使用Apache Commons库或JodaTime。 java.util.Calendar可能是我唯一的选择。

5 个答案:

答案 0 :(得分:27)

要完全从Date对象中删除时间,您可以使用:

public static Date removeTime(Date date) {    
        Calendar cal = Calendar.getInstance();  
        cal.setTime(date);  
        cal.set(Calendar.HOUR_OF_DAY, 0);  
        cal.set(Calendar.MINUTE, 0);  
        cal.set(Calendar.SECOND, 0);  
        cal.set(Calendar.MILLISECOND, 0);  
        return cal.getTime(); 
    }

将要修改的Date对象传递给方法,它将返回没有小时/分钟等的Date

如果不需要更改Date对象本身,请使用SimpleDateFormat。按照您想要的方式设置格式即。删除小时/分钟。然后调用format方法并传入要更改的Date对象。

SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy");
System.out.println(sdf.format(yourDate));

答案 1 :(得分:3)

TL;博士

如果您在UTC旧遗产java.util.Date对象的java.time.OffsetDateTime中表示午夜......

java.util.Date.from(
    OffsetDateTime.of( 
        LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
        LocalTime.MIN ,
        ZoneOffset.UTC
    ).toInstant()
)

如果可能,请放弃上面的旧Date部分,只使用现代java.time.Instantparticular time zone对象......

OffsetDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
    LocalTime.MIN ,
    ZoneOffset.UTC
).toInstant()

如果你的意思是java.time午夜而不是UTC ......

LocalDate.now()
         .atStartOfDay()

最好指定所需/预期的时区,而不是隐含地依赖当前默认值。

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

详细

警告:并非每个时区的每一天都有00:00:00的时间。夏令时可以跳到凌晨1点,消除午夜。

java.time

使用java.time类取代麻烦的旧遗留日期时间类,例如java.util.Date.Calendar

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( z );
ZonedDateTime zdt = localDate.atStartOfDay( z );

转换为旧版类

你应该尽可能坚持使用现代java.time类。但是,如果您必须拥有旧的遗留类的实例,则可以转换为/从java.time转换。查看添加到旧类的新方法

Calendar myLegacyCal = GregorianCalendar.from( zdt ) ;

Date myLegacyDate = Date.from( zdt.toInstant() ) ;

如果您想要一个始终在UTC时区的java.util.Date,将时间设置为00:00:00,请使用OffsetDateTime和常量ZoneOffset.UTC

OffsetDateTime odt = OffsetDateTime.of( localDate , LocalTime.MIN , ZoneOffset.UTC ) ;
Date myLegacyDate = Date.from( odt.toInstant() ) ;

关于java.time

legacy框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.util.Date日期时间类,例如CalendarSimpleDateFormat和& Joda-Time

现在位于maintenance modejava.time项目建议迁移到Oracle Tutorial类。

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

从哪里获取java.time类?

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


约达时间

更新:Joda-Time项目现在处于维护模式。该团队建议迁移到java.time类。此部分保留为历史记录。

使用withTimeAtStartOfDay() 2.3,为此目的使用方法:{{3}}。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;

DateTime now = new DateTime();
DateTime firstMomentOfToday = now.withTimeAtStartOfDay();

System.out.println( "now: " + now );
System.out.println( "firstMomentOfToday: " + firstMomentOfToday );

跑步时......

now: 2013-12-05T23:00:23.785-08:00
firstMomentOfToday: 2013-12-05T00:00:00.000-08:00

答案 2 :(得分:1)

在Java 8中,也可以使用java.time.LocalDate.atStartOfDay()':

    Date date = new Date();
    Instant inst = date.toInstant();
    LocalDate localDate = inst.atZone(ZoneId.systemDefault()).toLocalDate();
    Instant dayInst = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
    Date day = Date.from(dayInst);

答案 3 :(得分:1)

类似于@ Sionnach733,要从Date中删除时间,您可以使用clear为DateTimeUtils编写此函数:

public static Date getDateOnly(final Date input) {
        final Calendar cal = Calendar.getInstance();
        cal.setTime(input);
        cal.clear(Calendar.HOUR_OF_DAY);
        cal.clear(Calendar.MINUTE);
        cal.clear(Calendar.SECOND);
        cal.clear(Calendar.MILLISECOND);
        return cal.getTime();
    }

答案 4 :(得分:1)

最新版本由Ole.V.V提供

import java.time.*;

Instant dInst = LocalDate.of(1980, Month.JANUARY, 8).atStartOfDay(ZoneOffset.UTC).toInstant();
long milli = dInst.toEpochMilli();