Java中以小时为参数的getActualMinimum返回12

Java中以小时为参数的getActualMinimum返回12,java,android,java-calendar,Java,Android,Java Calendar,我试图通过调用方法calendar.set(calendar.HOUR,calendar.getActualMinimum(calendar.HOUR)),来设置calendar的时间但是getActualMinimum(Calendar.HOUR)返回12而不是0。尝试使用Calendar.HOUR\u of\u DAY尝试使用Calendar.HOUR\u of\u DAYtl;博士 使用java.time类,而不是有问题的遗留类 要获得一天中的第一刻,请致电 java.time 您使用的是

我试图通过调用方法
calendar.set(calendar.HOUR,calendar.getActualMinimum(calendar.HOUR)),来设置
calendar
的时间
但是
getActualMinimum(Calendar.HOUR)
返回12而不是0。

尝试使用
Calendar.HOUR\u of\u DAY
尝试使用
Calendar.HOUR\u of\u DAY
tl;博士 使用java.time类,而不是有问题的遗留类

要获得一天中的第一刻,请致电

java.time 您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java.time类取代

获取当前日期和时间需要时区。在任何一个特定的时刻,全球各地的日期和时间因地区而异

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
用时间提取该日期的仅日期部分

LocalDate ld = zdt.toLocalDate() ;
从那个日期开始,让java.time确定一天中的第一个时刻。永远不要假设一天从00:00:00开始。夏时制(DST)等异常意味着一天可能在另一个时间开始,如01:00:00

time类使用。新对象不是改变对象上的属性(“mutate”),而是基于原始对象的值创建新对象

ZonedDateTime zdtResult = null ;
对于
开关
语句,请使用现有枚举。由于一个奇怪的技术问题,
switch
语句不能使用限定的枚举名。因此,我们必须使用
YEARS
而不是
ChronoUnit.YEARS
作为开关变量。使用静态导入访问枚举

import static java.time.temporal.ChronoUnit ;
…

switch ( unit ) {
    case YEARS : 
        zdtResult = ld.withDayOfYear( 1 )
                      .atStartOfDay( z ) ;
        break;

    case MONTHS : 
        zdtResult = ld.withDayOfMonth( 1 )
                      .atStartOfDay( z ) ;
        break;

    case WEEKS : 
        zdtResult = ld.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY) )
                      .atStartOfDay( z ) ;
        break;

    default: …
}
从结果中提取一个对象,以UTC格式查看同一时刻

Instant instant = zdtResult.toInstant() ;
您的问题的目标似乎是从UTC中1970年第一个时刻的历元参考开始计算毫秒数。我强烈建议不要仅仅使用
long
整数来跟踪日期时间值。使调试和跟踪变得麻烦,可能会漏掉bug。而是传递和存储对象

但如果你坚持计数,代码是这样的。当心数据丢失,因为
瞬间
的分辨率为纳秒,因此此调用将忽略任何现有的微秒或纳秒

long millisSinceEpoch = instant.toEpochMillis() ;
请注意,使用java.time可以使代码更短、更整洁、可读性更强


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(tl;dr 使用java.time类,而不是有问题的遗留类

      要获得一天中的第一刻,请致电

      java.time 您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java.time类取代

      获取当前日期和时间需要一个时区。对于任何给定的时刻,全球各地的日期和时间因区域而异

      ZoneId z = ZoneId.of( "America/Montreal" ) ;
      ZonedDateTime zdt = ZonedDateTime.now( z ) ;
      
      用时间提取该日期的仅日期部分

      LocalDate ld = zdt.toLocalDate() ;
      
      从该日期开始,让java.time确定一天中的第一个时刻。永远不要假设一天从00:00:00开始。夏时制(DST)等异常情况意味着一天可能从另一个时间开始,如01:00:00

      time类使用。而不是改变对象上的属性(“mutate”),而是基于原始对象的值创建新对象

      ZonedDateTime zdtResult = null ;
      
      对于
      switch
      语句,请使用现有的enum。由于一个奇怪的技术问题,
      switch
      语句无法使用限定的enum名称。因此,我们必须使用
      YEARS
      而不是
      ChronoUnit.YEARS
      作为开关变量。例如,使用静态导入访问enum

      import static java.time.temporal.ChronoUnit ;
      …
      
      switch ( unit ) {
          case YEARS : 
              zdtResult = ld.withDayOfYear( 1 )
                            .atStartOfDay( z ) ;
              break;
      
          case MONTHS : 
              zdtResult = ld.withDayOfMonth( 1 )
                            .atStartOfDay( z ) ;
              break;
      
          case WEEKS : 
              zdtResult = ld.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY) )
                            .atStartOfDay( z ) ;
              break;
      
          default: …
      }
      
      从结果中提取一个对象,以UTC格式查看同一时刻

      Instant instant = zdtResult.toInstant() ;
      
      您的问题的目标似乎是从UTC 1970年第一个时刻的历元引用开始计算毫秒数。我强烈建议不要仅使用
      long
      整数来跟踪日期-时间值。这会使调试和跟踪变得麻烦,可能会漏掉bug。请传递并存储对象

      但是如果您坚持计数,下面是代码。当心数据丢失,因为
      瞬间
      的分辨率为纳秒,因此此调用将忽略任何现有的微秒或纳秒

      long millisSinceEpoch = instant.toEpochMillis() ;
      
      请注意,使用java.time可以使代码更短、更整洁、可读性更强


      关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

      该项目现已启动,建议迁移到类

      要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

      您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
      java.sql.*
      classes

      从哪里获得java.time类

      • 然后
        • 内置的
        • 标准JavaAPI的一部分,带有捆绑实现
        • Java9添加了一些次要功能和修复
        • 大部分java.time功能都在中向后移植到Java6和Java7
        • java.time类的Android捆绑包实现的更高版本