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

Ant*_*ong 14 java date

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

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

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

Sio*_*733 30

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(); 
    }
Run Code Online (Sandbox Code Playgroud)

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

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

SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy");
System.out.println(sdf.format(yourDate));
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

tl;博士

如果你的意思是在旧的遗留对象中的UTC午夜java.util.Date......

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

如果可能,丢弃Date上面的遗留部分,只使用现代java.time.OffsetDateTimejava.time.Instant对象......

OffsetDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
    LocalTime.MIN ,
    ZoneOffset.UTC
).toInstant()
Run Code Online (Sandbox Code Playgroud)

如果您指的是特定时区的午夜而不是 UTC...

LocalDate.now()
         .atStartOfDay()
Run Code Online (Sandbox Code Playgroud)

最好指定您想要/预期的时区,而不是隐式依赖当前默认值。

LocalDate.now( ZoneId.of( "Pacific/Auckland" )  )
         .atStartOfDay( ZoneId.of( "Pacific/Auckland" ) )
Run Code Online (Sandbox Code Playgroud)

细节

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

时间

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

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( z );
ZonedDateTime zdt = localDate.atStartOfDay( z );
Run Code Online (Sandbox Code Playgroud)

转换为/从遗留类

您应该尽可能坚持使用现代 java.time 类。但是,如果您必须拥有旧遗留类的实例,则可以与 java.time 相互转换。寻找添加到旧类的新方法

Calendar myLegacyCal = GregorianCalendar.from( zdt ) ;

Date myLegacyDate = Date.from( zdt.toInstant() ) ;
Run Code Online (Sandbox Code Playgroud)

如果您希望java.util.Date始终处于 UTC 时区的 具有 00:00:00 的时间,请OffsetDateTime与常量 一起使用ZoneOffset.UTC

OffsetDateTime odt = OffsetDateTime.of( localDate , LocalTime.MIN , ZoneOffset.UTC ) ;
Date myLegacyDate = Date.from( odt.toInstant() ) ;
Run Code Online (Sandbox Code Playgroud)

关于 java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


乔达时间

更新:Joda-Time 项目现在处于维护模式。该团队建议迁移到 java.time 类。这部分作为历史完好无损。

使用Joda-Time 2.3,为此目的使用一种方法:withTimeAtStartOfDay()

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

运行时…

OffsetDateTime.of( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
    LocalTime.MIN ,
    ZoneOffset.UTC
).toInstant()
Run Code Online (Sandbox Code Playgroud)