Java日历获取当前日期,没有小时,分钟,秒和毫秒,以毫秒为单位

我想以毫秒为单位获取当前日期,只有年,月和日期。 但是当我使用这段代码时:

Calendar cal = Calendar.getInstance(); cal.clear(Calendar.HOUR); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); currentDate = cal.getTimeInMillis(); 

我仍然以毫秒为单位获得时间。 我怎样才能解决这个问题?

//安德烈

 Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); currentDate = cal.getTimeInMillis(); 

请注意日历的时区。

如果你只想要这个相对于GMT并明确只需要几毫秒,你可以使用这个:

 long now = System.currentTimeMillis(); long today = now - now % 86400000; 

来自javadoc :HOUR_OF_DAY,HOUR和AM_PM字段是独立处理的,并且应用了时间的解析规则。 清除其中一个字段不会重置此日历的小时值。 使用set(Calendar.HOUR_OF_DAY,0)重置小时值。

 cal.set(Calendar.HOUR, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); 

可能还需要设置AM / PM

TL;博士

 LocalDate.now() 

LocalDate

如果您想要的实际上只是没有时间的日期,请使用LocalDate类。

LocalDate类表示没有时间且没有时区的仅日期值。

时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如, 法国巴黎午夜过后几分钟,在魁北克蒙特利尔的 “昨天”仍然是新的一天。

continent/region的格式指定适当的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z ); 

ZonedDateTime

如果您希望将日期设置为当天的第一时刻,请让java.time为您确定该时刻。 不要假设第一时刻是00:00:00。 夏令时等exception意味着第一时刻可能会发生在其他时间,例如01:00:00。

使用该时区对象ZoneId生成ZonedDateTime对象。

 ZonedDateTime zdt = today.atStartOfDay( z ); // Determine the first moment of the day on this date for this time zone. 

要将此时刻视为UTC中的值,请提取Instant对象。

 Instant instant = zdt.toInstant(); 

避免遗留日期时间类

避免麻烦旧的日期时间类,如Calendar 。 这些现在已经遗留下来,取而代之的是java.time类。


关于java.time

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

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

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

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

如果你想使用Joda时间 :

  long millis = new DateMidnight().getMillis();