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

时间:2012-11-28 10:08:48

标签: java

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

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);

我的输出就像

28
112
10
Wed Nov 28 15:37:30 IST 2012

这里有什么问题?

7 个答案:

答案 0 :(得分:4)

  

这里有什么问题?

您的编译器应该通过警告告诉您出现了什么问题:您正在使用Date上的弃用方法开始。 不要忽略这些警告。

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

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

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

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

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

但是,理想情况下,您应该使用Joda Time - 它是比内置API更明智的日期/时间API。

答案 1 :(得分:2)

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

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

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

myGregorianCalendar.get(GregorianCalendar.MONTH);

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

使用日历对象

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

答案 5 :(得分:0)

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

  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);

我的输出就像

month = 11
year = 2012
date = 7
Wed Nov 07 13:28:23 PKT 2012

答案 6 :(得分:0)

TL;博士

YearMonth ym = 
    YearMonth.from(
        LocalDateTime.parse( "2012-11-07T13:28:23" )
    )

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

详细

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

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

java.time

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

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

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

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP

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

解析字符串

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

ISO 8601

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

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

获得年份&月

生成的对象有更好的方法来处理所需的部件以及更多。

获得年份呈现的实际年份不同于您对旧班级的麻烦。对于2016年,您获得2016

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

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

Month month = ldt.getMonth();

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

int monthNumber = month.getValue();

YearMonth

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

YearMonth ym = YearMonth.from( ldt );