2

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

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

这里有什么问题?

4

7 回答 7

4

这里有什么问题?

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

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

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

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

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

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

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

于 2012-11-28T10:11:25.817 回答
2

Year是基于,1900所以你得到1900 + 112或 2012 我们称之为。

是从Month0 开始的(一月是 0 月),所以需要加 1。

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

myGregorianCalendar.get(GregorianCalendar.MONTH);
于 2012-11-28T10:11:28.853 回答
1

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

于 2012-11-28T10:10:17.407 回答
1

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

于 2012-11-28T10:11:38.000 回答
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

于 2012-11-28T10:11:41.317 回答
1

遵循此代码,您将获得准确的月份、年份和日期:

  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
于 2012-11-28T11:42:21.677 回答
1

tl;博士

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 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP进一步适应Android

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。

解析字符串

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

ISO 8601

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

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 );
于 2016-07-01T17:42:05.667 回答