![](/img/trans.png)
[英]Calendar.HOUR_OF_DAY always showing 1 hour advance and 12 Hour Format
[英]Java Calendar Hour of Day Returning 12 Hour Format
在Java文档中, Calendar.HOUR
应该以12小时格式返回小时,而Calendar.HOUR_OF_DAY
应该以24小时格式返回小时,但这两种格式都以12小时格式返回。
我的代码:
Calendar rightNow = Calendar.getInstance();
int hour = rightNow.get(Calendar.HOUR_OF_DAY);
System.out.println("hour: " + hour);
有一个类似于我的问题,但是有一个特定的时间,我试图用当前的时间做这个。 这个问题在这里java HOUR和HOUR_OF_DAY都返回12小时的时间
编辑:
如果重要,这将发生在Windows上的Eclipse,Windows上的cmd.exe和Ubuntu上的终端中。
编辑2
现在我感到愚蠢......我没有意识到我有多个调用当前时间的实例,而我正在查看错误的一个,这是HOUR_OF_DAY,但是我在控制台中看到的那个被发布了小时...感谢您在评论中的帮助和我自己的帖子编辑,这让我意识到自己的错误
试试这个测试
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR, 17);
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(c.get(Calendar.HOUR));
它打印
17
5
设置小时时,使用HOUR_OF_DAY
和24小时表示法很重要,或者使用HOUR
并提供AM_PM
字段...
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 17);
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(c.get(Calendar.HOUR));
System.out.println(c.get(Calendar.AM_PM));
c.set(Calendar.HOUR_OF_DAY, 5);
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(c.get(Calendar.HOUR));
System.out.println(c.get(Calendar.AM_PM));
会印...
17
5
1 // PM
5
5
0 // AM
我用的时候
c.set(Calendar.HOUR, 17);
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(c.get(Calendar.HOUR));
System.out.println(c.get(Calendar.AM_PM));
我明白了......
5
5
0 // AM
这意味着API已过滤结果并进行内部更正。 将正确的字段用于正确的值是非常重要的,因为Calendar
可以按其认为合适的方式滚动值...
如果我添加c.setLenient(false);
,它会抛出一个java.lang.IllegalArgumentException: HOUR
因为17
不是HOUR
的有效值
如果您在服务器端运行代码然后停止服务器,然后从服务器删除项目并清理服务器后,您的问题解决了。
但如果没有,那么创建一个Test类:
public class Test {
public static void main(String[] args) {
Calendar calender = Calendar.getInstance();
System.out.println(calender.getTimeInMillis());
calender.set(Calendar.HOUR, 2);
System.out.println(calender.getTimeInMillis());
System.out.println(calender.get(Calendar.HOUR_OF_DAY));
System.out.println(calender.get(Calendar.HOUR_OF_DAY));
System.out.println(calender.get(Calendar.HOUR));
Calendar calender1 = Calendar.getInstance();
System.out.println(calender1.getTimeInMillis());
calender1.setTimeInMillis(calender.getTimeInMillis());
System.out.println(calender1.getTimeInMillis());
System.out.println(calender1.getTimeInMillis());
}}
然后右键单击eclipse中的类并作为java应用程序运行。 然后它工作
我试过你的来源。
它可以得到正确的结果。
Instant.now()
.atZone( ZoneId.of( "America/New_York" ) )
.getHour()
您正在使用现在由java.time类取代的麻烦的旧遗留日期时间类。
Instant
Instant
类表示UTC时间轴上的一个时刻,分辨率为纳秒 。
获取当前时刻:
Instant instant = Instant.now();
instant.toString():2016-09-16T20:46:01.123456789Z
ZonedDateTime
时区对于确定日期和时间至关重要。 对于任何特定时刻,日期和时间在全球范围内因地区而异。
应用时区来查看某个地区的挂钟时间 。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString()2016-09-16T16:46:01.123456789-04:00 [美国/蒙特利尔]
以0-23的数字询问时间。
int hourOfDay = zdt.gotHour();
16
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧日期时间类,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,并进一步适应的Android在ThreeTenABP (见如何使用...... )。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
检查我的代码中引用Calendar对象的所有区域以尝试获取小时数是问题所在。 我在三个不同的位置做了这个,但只修改了三个中的一个,这就是为什么我的更新似乎没有生效
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.