Android 中的 GregorianCalendar(添加 Calendar.HOUR_OF_DAY 与 Calendar.HOUR)

GregorianCalendar in Android (add Calendar.HOUR_OF_DAY vs Calendar.HOUR)

要将当前时间加一小时,我可以使用这个吗?

Calendar mcalendar = new GregorianCalendar();
mcalendar.add(Calendar.HOUR_OF_DAY, 1); //I plan to use 24 hours format

我看到很多例子使用:

Calendar mcalendar = Calendar.getInstance();
mcalendar.add(Calendar.HOUR, 1);
Calendar mcalendar = new GregorianCalendar();

GreogorianCalendar 是摘要 class Calendar 的子class。因此,您在这里所做的是将 GregorianCalendar 的实例引用到日历,因此 Calendar 中的所有抽象方法都将遵循 GregorianCalendar

的实现

但是因为你的目的是增加小时数。

您可以继续使用 Calendar mcalendar = Calendar.getInstance();,因为它使用当前 Locale.

检索当前的实例

但是,如果你想改变你的Locale,将参数传入getInstance()方法,将为你生成一个指定Locale的实例。

参考:https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getInstance(java.util.Locale)

如果您想使用营业时间:

执行以下操作:

不要使用 HOUR 变量,因为这仅适用于 12 小时。使用 Calendar.HOUR_Of_DAY 处理 24 小时计时。

tl;博士

Duration duration = Duration.ofHours( 1 ) ;
ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( zoneId ).plus( duration ) ;
DateTimeFormatter f = DateTimeFormatter
                      .ofLocalizedDateTime( FormatStyle.FULL )
                      .withLocale( Locale.GERMANY) ;
String output = zdt.format( f ) ;

Sonntag, 27. Dezember 2020 um 22:58:52 Nordamerikanische Ostküsten-Normalzeit

java.time

现代解决方案使用java.time类。切勿使用 CalendarGregorianCalendar.

UTC

捕捉 UTC 显示的当前时刻。使用 Instant.

Instant instant = Instant.now() ;  // Capture the current moment as seen in UTC.

定义一个独立于时间线的时间跨度。

Duration duration = Duration.ofHours( 1 ) ;

加法。

Instant instantHourLater = instant.plus( duration ) ;

分区

您可能希望通过特定地区的人们使用的挂钟时间来查看那一刻的时间和日期。应用时区 (ZoneId) 以获得 ZonedDateTime 对象。同一时刻,时间轴上的同一点,不同的挂钟时间。

ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( zoneId ) ;

或者,跳过 InstantDuration

ZonedDateTime zdt = ZonedDateTime.now( zoneId ).plusHours( 1 ) ;

正文

你说:

I plan to use 24 hours format

InstantOffsetDateTimeZonedDateTime等类代表一个时刻,时间轴上的一个点。它们与文本无关。他们没有“格式”。他们可以解析代表一个时刻的文本,并且可以生成代表一个时刻的文本。但在内部,他们有自己的方式来表示那一刻,没有任何格式化的文本。

要生成特定格式的文本,请使用 DateTimeFormatter class with FormatStyle and Locale。这已经在 Stack Overflow 上被多次提及。所以搜索以了解更多信息。

DateTimeFormatter f = DateTimeFormatter
                      .ofLocalizedDateTime( FormatStyle.FULL )
                      .withLocale( Locale.CANADA_FRENCH ) 
;
String output = zdt.format( f ) ;

看到这个code run live at IdeOne.com

output: dimanche 27 décembre 2020 à 22 h 51 min 57 s heure normale de l’Est


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time.

在哪里获取 java.time 类?