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.Date
和java.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 );
您可以通过getYear
, getMonth
和getDayOfMonth
获取各种信息。 你实际上会用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已被弃用。