提问者:小点点

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


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

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

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


共3个答案

匿名用户

要从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));

匿名用户

如果您是指旧的遗留java.util.Date对象中的UTC午夜…

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

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

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

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

LocalDate.now()
         .atStartOfDay()

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

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

注意:并非每个时区的每一天都是00:00:00。夏令时可以跳到凌晨1点,省去了一个午夜。

使用 java.time 类来取代麻烦的旧旧日期时间类,如 java.util.Date.日历

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框架内置于Java 8和更高版本中。这些类取代了麻烦的旧式日期-时间类,如< code>java.util.Date、< code>Calendar,

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

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

在哪里获得 java.time 类?

    < li>Java SE 8、Java SE 9和更高版本 < ul > < li >内置。 < li >捆绑实现的标准Java API的一部分。 < li>Java 9增加了一些小功能和修复。
  • 许多 java.time 功能向后移植到 Java 6
  • ThreeTenABP项目将ThreeTen Backport(如上所述)专门用于Android
  • 请参阅如何使用ThreeTenABP

ThreeTen-Extra项目用额外的类扩展了java.time。这个项目是java.time未来可能增加的内容的试验场。您可能会在这里找到一些有用的类,如< code>Interval 、< code>YearWeek 、< code>YearQuarter等等。

更新:Joda Time项目现在处于维护模式。团队建议迁移到java.time类。这一部分作为历史保留下来。

使用 Joda-Time 2.3,有一个用于此目的的方法:withTimeAtStartOfDay()。

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

匿名用户

在Java 8中,也可以使用“Java . time . local date . atstartoday()”:

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