获得月份和年份的java日期问题

java date issue in getting month and year

我从数据对象中提取月份和年份时遇到问题。

1
2
3
4
5
6
7
8
String strdate ="2012-11-07T13:28:23";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
// Date date = dateFormat.parse(strdate);
Date date = new Date();
System.out.println(date.getDate());
System.out.println(date.getYear());
System.out.println(date.getMonth());
System.out.println(date);

我的输出就像

1
2
3
4
28
112
10
Wed Nov 28 15:37:30 IST 2012

这有什么不对?


what is wrong here ?

你的编译器应该通过警告告诉你出了什么问题:你在Date上使用了弃用的方法,开头。不要忽视这些警告。

您应该使用Calendar来获取日/月/年等值,因为Calendar具有关联的日历系统和时区,这两者都是必需的,以便获得合理的值。

接下来出现的问题是,您只需获取当前日期和时间,而不是使用strdatedateFormat

1
2
// Date date = dateFormat.parse(strdate);
Date date = new Date();

new Date()始终返回系统报告的当前日期/时间。

但是,如果你对112和10感到困惑,你应该阅读你正在调用的方法的文档,这解释了getYear()基于1900返回一年(所以返回值为112意味着年份是2012),并且getMonth()返回基于0的月份(因此1月= 0)。请务必阅读您正在调用的方法的文档,特别是如果您认为它们给您带来奇怪的结果。

然而,理想情况下,你应该使用Joda Time - 它是一个比内置的更合理的日期/时间API。


Year基于1900,因此我们称之为1900 + 112或2012。

Month是从0开始的(1月是0个月),因此您需要添加1。

无论如何,最好使用基于该日期构建的GregorianCalendar来检索该信息(以及更多信息),因为这些Date方法已被弃用。

1
myGregorianCalendar.get(GregorianCalendar.MONTH);


请改用日历对象

1
2
3
4
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
int year=cal.get(Calendar.YEAR);

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html


当您说new Date()时,它将创建一个包含当前日期和时间的新Date对象。您正在调用刚刚实例化的Date值的方法。


没有错误。 date.getMonth()从零开始(january = 0)


TL;博士

1
2
3
4
5
6
7
YearMonth ym =
    YearMonth.from(
        LocalDateTime.parse("2012-11-07T13:28:23" )
    )

int month = ym.getMonthValue();
int year = ym.getYear();

细节

其他答案是正确的,尤其是Jon Skeet的答案。

让我补充一点,你正在使用麻烦的旧遗留日期时间类。避免他们。

java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,如java.util.Date.Calendar和& java.text.SimpleDateFormat

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

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。

许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport中,并在ThreeTenABP中进一步适应Android。

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。

解析字符串

您的输入字符串缺少有关UTC或时区偏移的任何信息。因此我们将其解析为LocalDateTime,其中"Local"表示任何位置,而不是一个特定位置。因此,它代表了关于可能时刻的粗略想法,但不是时间轴上的实际点。

ISO 8601

String的格式符合ISO 8601标准。在解析和生成String对象时,java.time类默认使用这些标准格式。因此无需定义解析模式。

1
2
String input ="2012-11-07T13:28:23";
LocalDateTime ldt = LocalDateTime.parse( input );

获得一年和一年月

生成的对象有更好的方法来处理您想要的部件以及更多。

获得这一年是一个实际的一年,不像你对老班的麻烦。对于2016年,您将获得2016

1
int year = ldt.getYear();  // 2016

对于月份,getter会从方便的Month枚举中为您提供一个对象。在代码库中使用此类对象而不仅仅是整数,以从类型安全性,保证有效值和更多自我记录代码中受益。

1
Month month = ldt.getMonth();

但如果你必须,你可以要求一个数字,1-12(不是你在老班上看到的疯狂0-11)。

1
int monthNumber = month.getValue();

<5233>

有一个类用于表示没有日期的年份和月份,YearMonth。我建议传递这个类的对象而不仅仅是整数。这样做会带来类型安全性,有效值和自我记录代码。

1
YearMonth ym = YearMonth.from( ldt );


点击此代码,您将获得确切的月,年和日期:

1
2
3
4
5
6
7
8
9
10
  String strdate ="2012-11-07T13:28:23";
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
  Date date = dateFormat.parse(strdate.toString());

  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  System.out.println("month =" + (cal.get(Calendar.MONTH) + 1 ));// add 1 because Month starts from 0 in java
  System.out.println("year =" + cal.get(Calendar.YEAR)) ;
  System.out.println("date =" + cal.get(Calendar.DATE));
  System.out.println(date);

我的输出就像

1
2
3
4
month = 11
year = 2012
date = 7
Wed Nov 07 13:28:23 PKT 2012