【问题标题】:How to set time of java.util.Date instance to 00:00:00?如何将 java.util.Date 实例的时间设置为 00:00:00?
【发布时间】:2013-12-06 01:34:54
【问题描述】:

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

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

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

【问题讨论】:

  • @AnthonyKong 仅供参考,您可以将 Joda-Time DateTime 对象转换为 java.util.Date 对象 (toDate),然后再转换回来。因此,您可以使用 Joda-Time 进行计算,而不会干扰其他现有代码。
  • 对于该问题的新读者,我建议您不要使用Date。该课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time APILocalDate。以及来自同一 API 的其他类,具体取决于您的具体要求。
  • 在某些时区存在没有任何 00:00:00 的日期。您必须让自己对获得一天的第一刻感到满意。

标签: java date


【解决方案1】:

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

【讨论】:

  • 对不起,我的问题可能不太清楚。最后,我想获得一个不带小时、分钟和秒的日期变量。
  • @Sionnach773 的解决方案既不包含小时,也不包含分钟或秒。它有什么问题?
  • @Sionnach733 完美!
【解决方案2】:

tl;博士

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

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

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

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

如果您指的是 particular time zone 的午夜而不是 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() ) ;

如果您希望 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() ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore


乔达时间

更新: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

【讨论】:

  • 问题是专门找一个DATE
  • @MaxAlexanderHanna 不。重读问题。作者考虑并排除了两个第三方库。然后最后一句建议使用Calendar 类。所以我可以有把握地假设(a)他们对 Java 中内置的替代类新类持开放态度,并且(b)他们只是在无知中运行,还没有被告知他们可用的 java.tine 类。
  • 问题是要求在 java.util.date 对象中设置时间不是吗?
  • @MaxAlexanderHanna 我已经向您指出了问题的相关部分,以纯文本形式编写。此外,我们有数百个 Java Date/Calendar 类问题,现在已按照 Sun、Oracle 和 JSR 社区的指示,通过 java.time 类直接取代遗留类 来回答这些问题。有时,唯一负责任的建议是放弃您的Yugo 并使用坐在车道上的本田。不过,我确实添加了一些用于与遗留对象相互转换的冗长语句和代码示例。
  • 那就更重要了。人们在试图寻找手头问题的答案时来到这里,而不是你试图自己想出的随机答案。回答所问的不要回答未问的以及您认为更好的问题。你现在因为这篇好帖子而获得了投票。
【解决方案3】:

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

【讨论】:

  • 正确答案。我只想指出,我们通常不会将现代 java.time 类与麻烦的旧旧日期时间类(例如 Date)混合在一起。因此,理想情况下,一旦获得Instant 对象,就会停止。仅在绝对必要时才转换为 Date,例如与一些尚未更新到 java.time 的旧代码交互。
【解决方案4】:

像@Sionnach733 一样,要从日期中删除时间,您可以为您的 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();
    }

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多