【问题标题】:Calender.YEAR not printing the right valueCalendar.YEAR 没有打印正确的值
【发布时间】:2015-12-20 20:25:35
【问题描述】:

我正在解析从用户查询接收的日期和来自 XML 文件的另一个日期。 当我只想获得年份时,它会打印 1 而不是年份,方法是:

calender.YEAR

这是代码:

Elements date = doc.getElementsByTag("DATE");

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date inputDate = dateFormat.parse(obj.tryParse(dateFrom));
Date xmlDate = dateFormat.parse(obj.tryParse(date.get(0).text()));

Calendar calInput = Calendar.getInstance();
Calendar calXml = Calendar.getInstance();

calInput.setTime(inputDate);
calXml.setTime(xmlDate);

System.out.println(calInput.YEAR +" "+ calXml.YEAR +" = "+calInput.getTime().toString()+"|||"+ calXml.getTime().toString());
if(calInput.YEAR != calXml.YEAR)
    continue;

这是一个输出示例:

Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Tue Jan 01 00:00:00 IST 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Sun Feb 01 00:00:00 IST 2004
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002
Info:   1 1 = Wed Jan 01 00:00:00 IST 2003|||Mon Apr 01 00:00:00 IDT 2002

【问题讨论】:

  • @YassinHajaj ,它应该打印 2003 和 2004 等!为什么它打印 1 1 !?
  • 因为您正在打印一个值为 1 的常量。

标签: java jsp date calendar


【解决方案1】:

calXml.YEAR 应该写成Calendar.YEAR,因为它是一个常量 (public static final) 值,可用作get(int field)add(int field, int amount) 等方法的参数。

要获取年份,请致电calXml.get(Calendar.YEAR)

【讨论】:

  • 由于 Java 的怪异,请注意 MONTH 的值是 0-11,而不是 1-12。
【解决方案2】:

Andreas 的Answer 是正确的。

java.time

或者,您可以使用 Java 8 及更高版本中内置的新 java.time 框架。旧的日期时间类是一团糟,应该避免。

从 java.util.Date 转换为 java.time.Instant。 Instant 是 UTC 时间线上的时刻。

Instant instant = yourJavaUtilDate.toInstant();

应用时区。您的问题代码隐含地取决于 JVM 当前的默认时区。我建议最好明确指定您想要/预期的时区。时区对于确定日期和年份至关重要。

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ); 
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

现在我们可以提取年份数字了。

int year = zdt.getYear();

或者更有趣的是,我们可以得到一个Year 对象。

Year year = Year.from( zdt );
Boolean isLeapYear = year.isLeap();
int yearNumber = year.getValue();

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2020-02-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多