java.util.Date和getYear()

我在Java有以下问题(我看到有些人在JavaScript中有类似的问题,但我使用Java)

System.out.println(new Date().getYear()); System.out.println(new GregorianCalendar().getTime().getYear()); System.out.println(this.sale.getSaleDate().getYear()); System.out.println(this.sale.getSaleDate().getMonth()); System.out.println(this.sale.getSaleDate().getDate()); 

回报

 I/System.out( 4274): 112 I/System.out( 4274): 112 I/System.out( 4274): 112 I/System.out( 4274): 1 I/System.out( 4274): 11 

我不明白我认为2012年的112位。发生了什么事? java.util.Date类是不可用的吗? 我将它作为一个字段存储在我的几个类中,以存储date和时间。 我该怎么办?

根据javadocs:

 @Deprecated public int getYear() 

已弃用 。 从JDK版本1.1开始,由Calendar.get(Calendar.YEAR) - 1900代替。

返回一个值,该值是从包含该date对象所表示的即时时间开始的年份中减去1900的结果,如本地时区中所解释的那样。

返回:此date表示的年份,减去1900。

另请参阅: 日历

所以112是正确的输出。 我会遵循Javadoc中的build议或使用JodaTime。

使用date格式

 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = format.parse(datetime); SimpleDateFormat df = new SimpleDateFormat("yyyy"); year = df.format(date); 

除了所有的注释之外,我还想添加一些关于如何根据javadoc使用java.util.Date,java.util.Calendar和java.util.GregorianCalendar的代码。

 //Initialize your Date however you like it. Date date = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); int year = calendar.get(Calendar.YEAR); //Add one to month {0 - 11} int month = calendar.get(Calendar.MONTH) + 1; int day = calendar.get(Calendar.DAY_OF_MONTH); 

不要使用Date ,使用Calendar

 // Beware: months are zero-based and no out of range errors are reported Calendar date = new GregorianCalendar(2012, 9, 5); int year = date.get(Calendar.YEAR); // 2012 int month = date.get(Calendar.MONTH); // 9 - October!!! int day = date.get(Calendar.DAY_OF_MONTH); // 5 

它也支持时间:

 Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17); int hour = dateTime.get(Calendar.HOUR_OF_DAY); // 15 int minute = dateTime.get(Calendar.MINUTE); // 16 int second = dateTime.get(Calendar.SECOND); // 17 

是的,这是事实。 另请参阅Javadoc :

 Returns: the year represented by this date, minus 1900. 

getYear方法由于这个原因而被弃用。 所以,不要使用它。

因此, this.sale.getSaleDate().getMonth()在2月份返回1,而不是2.虽然java.util.Calendar并没有将1900年添加到所有年份,确实遭受了一个月的问题。

使用JodaTime要好得多。

java.time

java.util.Datejava.util.Calendar类都是遗留的,现在被Java 8及更高版本中构build的java.time框架所取代。 大部分java.timefunction已被移植到Java 6和7,并进一步适用于Android。

时区对确定date至关重要。 对于任何特定的时刻,date可能因时区而异。

如果您只想要没有时间的date,请使用LocalDate 。 此课程缺less时区信息,但您可以指定一个时区来确定当前date。

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); LocalDate localDate = LocalDate.now( zoneId ); 

您可以通过getYeargetMonthgetDayOfMonth获取各种信息。 你实际上会用java.time获得年份号码!

 int year = localDate.getYear(); 

2016

如果你想要一个date时间,而不是一个date,使用ZonedDateTime类。

此行为在java.util.Date -class文档中进行了说明:

返回一个值,该值是从包含该date对象所表示的即时时间开始的年份中减去1900的结果,如本地时区中所解释的那样。

它也被标记为已弃用。 改用java.util.Calendar 。

Java 8 LocalDate类是从java.util.Date获取年份的另一个选项,

 int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear(); 

另一个select是,

 int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date)); 
  try{ int year = Integer.parseInt(new Date().toString().split("-")[0]); } catch(NumberFormatException e){ } 

大部分date已被弃用。