我有一个类型为java.util.Date
的变量。
如何将时间部分设置为00:00:00?
我不被允许使用Apache Commons库或JodaTime。java.util.Calendar
可能是我唯一的选择。
要从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.OffsetDateTime
或java.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 类?
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);