我在将字符串日期解析为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
。
我需要能够获得时间序列图表的日期,月份和年份。
答案 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的字段编号,表示月份。这是一个 特定于日历的值。格里高利一年中的第一个月 和朱利安的日历是
JANUARY
,0
;最后取决于 一年中的月数。
答案 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)
int year =
LocalDate.parse(
"04/12/2011" ,
DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.US )
).getYear() ;
2011
麻烦的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类使用合理的编号,使用:
询问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 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。