我从数据对象中提取月份和年份时遇到问题。
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
这里有什么问题?
答案 0 :(得分:4)
这里有什么问题?
您的编译器应该通过警告告诉您出现了什么问题:您正在使用Date
上的弃用方法开始。 不要忽略这些警告。
您应该使用Calendar
来获取日/月/年等值,因为Calendar
具有关联的日历系统和时区,这两者都是必需的,以便获得合理的值
接下来的问题是,您只是获取当前日期和时间,而不是使用strdate
和dateFormat
:
// 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)
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 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance 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”表示任何位置,而不是一个特定的位置。因此,它代表了关于可能时刻的粗略想法,但不是时间轴上的实际点。
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 );