我有一个java.util.Date
类型的变量。
如何将时间部分设置为00:00:00?
我不允许使用Apache Commons库或JodaTime。 java.util.Calendar
可能是我唯一的选择。
答案 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)
如果您在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.Instant
或particular 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.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() ) ;
legacy框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.util.Date
日期时间类,例如Calendar
,SimpleDateFormat
和& Joda-Time
现在位于maintenance mode的java.time项目建议迁移到Oracle Tutorial类。
要了解详情,请参阅JSR 310。并搜索Stack Overflow以获取许多示例和解释。规范是Java SE 8。
从哪里获取java.time类?
Interval
项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如YearWeek
,YearQuarter
,more和Joda-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();