2014-08-28 58 views
3

在Java文档中,Calendar.HOUR应该以12小时格式返回小时,而Calendar.HOUR_OF_DAY应该以24小时格式返回小时,但这两个都返回在12小时的格式。Java日历返回12小时格式的小时

我的代码:

Calendar rightNow = Calendar.getInstance(); 
int hour = rightNow.get(Calendar.HOUR_OF_DAY); 
System.out.println("hour: " + hour); 

有一个问题,就是与我相似了,但有是一个特定的时间,我试图与当前的时间来做到这一点。这个问题是在这里java HOUR and HOUR_OF_DAY both returning 12-hr time


编辑:

如果它的事项,这是在Eclipse中发生在Windows,CMD.EXE内的Windows,和终端在Ubuntu。


EDIT 2

现在我觉得愚蠢......我不知道,我不得不调用当前时间的多个实例,我一直在寻找的一个错误,这是HOUR_OF_DAY ,但一个我一直在控制台中看到正在张贴只是HOUR ...感谢您的评论的帮助和我自己的职位,导致我认识到我的错误

+0

现在几点了?它返回什么价值? – Beggs 2014-08-28 01:58:36

+0

现在是晚上9点,或21点,并且在HOUR和HOUR_OF_DAY都返回9时 – 2014-08-28 01:59:19

+1

您的代码无法编译。我做了以下更改: 'Calendar rightNow = Calendar.getInstance(); int hour = rightNow.get(Calendar.HOUR_OF_DAY);' 现在是晚上10点,它工作正常,并返回22. – Beggs 2014-08-28 02:01:18

回答

0

检查我的代码中引用Calendar对象的所有区域以尝试获取小时数是问题所在。我这样做是在三个不同的位置,但只修改这三个中的一个,这就是为什么我的更新似乎没有生效

12

试试这个测试编辑

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 
+0

即使是陌生人...我的回报 '5 5' – 2014-08-28 02:07:59

+0

如果我设置c.set(Calendar.HOUR,5);它打印5 5 – 2014-08-28 02:08:53

+0

如果我在我的设置#17 5' – 2014-08-28 02:11:02

1

我想你的来源。

它可以得到正确的结果。

7

当设定时间,它要么使用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

的有效值这是非常,重要
+0

那么我应该如何修改我当前的代码让HOUR_OF_DAY在当前时间正确返回? – 2014-08-28 02:27:57

+1

这取决于,如果您使用+12小时值,它将起作用。如果你使用1-12之间的值,那么你需要相应地设置AM_PM值......如果你说“小时是5”,那实际上意味着什么? '日历'只有一个原始的概念,实际上是什么意思... – MadProgrammer 2014-08-28 02:29:26

+0

在你当前的代码中,我还将检查'AM_PM'标志,看看有什么值... – MadProgrammer 2014-08-28 02:30:54

0

TL;博士

Instant.now() 
     .atZone(ZoneId.of("America/New_York")) 
     .getHour() 

使用java.time

你正在使用现在由java.time类取代的麻烦的旧式遗留日期时间类。

Instant

Instant类表示UTC时间轴与nanoseconds分辨率上一会儿。

获得当前时刻:

Instant instant = Instant.now(); 

instant.toString():2016-09-16T20:46:01.123456789Z

ZonedDateTime

时区是在确定关键日期和时间。对于任何特定时刻,日期和每日时间在全球范围内随区域而变化。

申请一个时区以查看某个地区的wall-clock time

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

关于java.time

java.time框架是建立在Java 8和更高版本。这些课程取代了麻烦的旧日期时间课程,如java.util.Date,.Calendar,& java.text.SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。

大部分的java.time功能后移植到Java 6 和ThreeTenABP还适于Android(见How to use…)。

ThreeTen-Extra项目扩展java.time与其他类。这个项目是未来可能增加java.time的一个试验场。你可以在这里找到一些有用的类,如Interval,YearWeek,YearQuarter,等等。

1

如果您在服务器端运行代码,然后停止服务器,然后从服务器和干净的服务器上删除项目,然后解决问题。

,但如果没有则创建一个测试类:在日食类

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

}} 

然后右键单击并作为运行Java应用程序。那么它的工作原理

相关问题