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

时间:2011-08-27 15:55:53

标签: java date calendar

我在将字符串日期解析为Date对象时遇到了一些麻烦。我使用DateFormat来解析字符串,当我打印日期的值时,它会给出我期望的结果。

但是,当我尝试得到一天,一个月或一年时,它给了我错误的价值观。例如,这一年是2011年,但当我.getYear()时,它给了我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

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

6 个答案:

答案 0 :(得分:42)

这些方法已被弃用。相反,请使用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

至于字段,这是从0开始的。这意味着1月= 0和12月= 11.正如javadoc所述,

  

get和set的字段编号,表示月份。这是一个   特定于日历的值。格里高利一年中的第一个月   和朱利安的日历是JANUARY0;最后取决于   一年中的月数。

答案 1 :(得分:10)

Javadoc救援:

  

已过时。从JDK 1.1版开始,替换为   Calendar.get(Calendar.YEAR) - 1900年。

     

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

您不应该使用弃用的方法。不推荐使用的方法是不应再使用的方法。但无论你使用什么方法,请阅读它的javadoc以了解它的作用。

答案 2 :(得分:9)

总统邪恶指出它,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();
}

答案 3 :(得分:3)

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

答案 4 :(得分:3)

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#getYear%28%29

规范声明它返回年份减去1900年。可能也是一个好主意,以避免弃用方法。

答案 5 :(得分:3)

TL;博士

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

2011

java.time

麻烦的java.util.Date类及其兄弟姐妹现在被优秀的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)。

询问LocalDate的组成部分。

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及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。