为什么Java的Date.getYear()返回111而不是2011?
我在将字符串日期解析为dateFrom
对象时遇到了一些麻烦。 我使用Sun Dec 04 00:00:00 GMT 2011
来解析该字符串,当我打印日期值时,它给出了我期望的结果。
但是,当我尝试获取日期,月份或年份时,会给我错误的值。 例如,那是2011年,但是当我执行dateFrom
时,它会给我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
。
我需要能够获取时间序列图的日期,月份和年份。
这些方法已被弃用。 而是,使用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
至于month字段,则从0开始。 这意味着一月= 0,十二月=11。如javadoc所述,
get和set的字段号指示月份。 这是一个 日历特定的值。 阳历年的第一个月 朱利安日历为
JANUARY
,即0
; 最后取决于 一年中的月份数。
抢救Javadoc:
不推荐使用。 从JDK 1.1版开始,由 Calendar.get(Calendar.YEAR)-1900。
返回一个值,该值是从减去1900的结果。 包含或以以下时间表示的瞬间开始的年份 此Date对象,在本地时区中解释。
您不应该使用不赞成使用的方法。 不推荐使用的方法是不应再使用的方法。 但是,无论使用哪种方法,都请阅读其javadoc以了解其作用。
邪恶总统将其钉牢,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();
}
[HTTP://download.Oracle.com/Java色/1.4.2/docs/API/Java/UT IL/date.HTML#get year%28%29]
规范指出,它返回的年份减去1900。避免使用不推荐使用的方法也是一个好主意。
tl;博士
int year =
LocalDate.parse(
"04/12/2011" ,
DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.US )
).getYear() ;
2011
java.time
麻烦的Interval
类及其兄弟类现在已由出色的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类利用合理的编号,其中包括:
- 1月-12月的1-12个月
- 2011代表2011
- 周一至周的星期几为1-7(根据ISO 8601)。
询问Interval
的组成部分。
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.time框架内置于Java 8及更高版本中。 这些类别取代了麻烦的旧日期时间类别,例如Interval
、YearWeek
和YearQuarter
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参见Oracle教程。 并在Stack Overflow中搜索许多示例和说明。
许多java.time功能都在ThreeTen-Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应了Android(请参阅如何使用…)。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可能会在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
等。
这仅是一个猜测,但111可能是自1900年以来的年数。请查看文档/进行一些测试以验证这一点(我目前无法检查)