为什么Java的Date.getYear()返回111而不是2011?

我在将字符串日期解析为dateFrom对象时遇到了一些麻烦。 我使用Sun Dec 04 00:00:00 GMT 2011来解析该字符串,当我打印日期值时,它给出了我期望的结果。

但是,当我尝试获取日期,月份或年份时,会给我错误的值。 例如,那是2011年,但是当我执行dateFrom时,它会给我111。我不知道为什么会这样。 这是相关的代码段:

    Date dateFrom = null;

    String gDFString = g.getDateFrom();

    System.out.println(gDFString);

    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    try {
        dateFrom = df.parse("04/12/2011");

        System.out.println(dateFrom);

        System.out.println(dateFrom.getYear());
    } catch (ParseException e) {
        e.printStackTrace();
    }

当我打印dateFrom时,我得到Sun Dec 04 00:00:00 GMT 2011,这就是您所期望的。 但是打印.getYear()返回111

我需要能够获取时间序列图的日期,月份和年份。

Ben Calder asked 2020-08-12T04:48:06Z
6个解决方案
43 votes

这些方法已被弃用。 而是,使用Calendar类。


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public final class DateParseDemo {
    public static void main(String[] args){
         final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
         final Calendar c = Calendar.getInstance();
         try {
             c.setTime(df.parse("04/12/2011"));
             System.out.println("Year = " + c.get(Calendar.YEAR));
             System.out.println("Month = " + (c.get(Calendar.MONTH)));
             System.out.println("Day = " + c.get(Calendar.DAY_OF_MONTH));
         } 
         catch (ParseException e) {
             e.printStackTrace();
         }
    }
}

输出:

Year = 2011
Month = 3
Day = 12

至于month字段,则从0开始。 这意味着一月= 0,十二月=11。如javadoc所述,

get和set的字段号指示月份。 这是一个 日历特定的值。 阳历年的第一个月 朱利安日历为JANUARY,即0; 最后取决于 一年中的月份数。

mre answered 2020-08-12T04:48:26Z
10 votes

抢救Javadoc:

不推荐使用。 从JDK 1.1版开始,由 Calendar.get(Calendar.YEAR)-1900。

返回一个值,该值是从减去1900的结果。 包含或以以下时间表示的瞬间开始的年份 此Date对象,在本地时区中解释。

您不应该使用不赞成使用的方法。 不推荐使用的方法是不应再使用的方法。 但是,无论使用哪种方法,都请阅读其javadoc以了解其作用。

JB Nizet answered 2020-08-12T04:49:00Z
9 votes

邪恶总统将其钉牢,Date.getYear()返回的值是从包含的年份中减去1900的结果。 而且您不应该使用它。

但是问题代码的快速解决方法是:

Date dateFrom = null;

String gDFString = g.getDateFrom();

System.out.println(gDFString);

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

try {
    dateFrom = df.parse("04/12/2011");

    System.out.println(dateFrom);

    // Add 1900 to dateFrom.getYear() 

    System.out.println(dateFrom.getYear()+1900);
} catch (ParseException e) {
    e.printStackTrace();
}
Dimitar Pavlov answered 2020-08-12T04:49:25Z
4 votes

[HTTP://download.Oracle.com/Java色/1.4.2/docs/API/Java/UT IL/date.HTML#get year%28%29]

规范指出,它返回的年份减去1900。避免使用不推荐使用的方法也是一个好主意。

answered 2020-08-12T04:49:52Z
4 votes

tl;博士

int year = 
    LocalDate.parse( 
        "04/12/2011" , 
        DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.US ) 
    ).getYear() ;  

2011

java.time

麻烦的Interval类及其兄弟类现在已由出色的java.time类取代。

String input = "04/12/2011";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale );
LocalDate ld = LocalDate.parse( input , f );

java.time类利用合理的编号,其中包括:

  • 1月-12月的1-12个月
  • 2011代表2011
  • 周一至周的星期几为1-7(根据ISO 8601)。

询问Interval的组成部分。

int year = ld.getYear();  // 2011
int month = ld.getMonthValue();  // 4
int dayOfMonth = ld.getDayOfMonth();  // 12

您甚至可以要求自动本地化的月份名称和星期几的名称。

String monthName = ld.getMonth().getDisplayName( TextStyle.FULL_STANDALONE , Locale.CANDA_FRENCH ); // avril

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类别取代了麻烦的旧日期时间类别,例如IntervalYearWeekYearQuarter

现在处于维护模式的Joda-Time项目建议迁移到java.time。

要了解更多信息,请参见Oracle教程。 并在Stack Overflow中搜索许多示例和说明。

许多java.time功能都在ThreeTen-Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应了Android(请参阅如何使用…)。

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。

Basil Bourque answered 2020-08-12T04:51:15Z
3 votes

这仅是一个猜测,但111可能是自1900年以来的年数。请查看文档/进行一些测试以验证这一点(我目前无法检查)

epochengine answered 2020-08-12T04:51:36Z
translate from https://stackoverflow.com:/questions/7215621/why-does-javas-date-getyear-return-111-instead-of-2011