【问题标题】:java XMLGregorianCalendar shows different year on conversion [duplicate]java XMLGregorianCalendar在转换时显示不同的年份[重复]
【发布时间】:2020-04-15 02:37:01
【问题描述】:

下面的简单测试用例给出的结果与预期不同。

import javax.xml.datatype.XMLGregorianCalendar;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {

            XMLGregorianCalendar xmlDate = new XMLGregorianCalendarImpl();
            xmlDate.setMonth(12);
            xmlDate.setDay(31);
            xmlDate.setYear(2019);
            xmlDate.setHour(0);
            xmlDate.setMinute(0);
            xmlDate.setSecond(0);
            Calendar calendar = xmlDate.toGregorianCalendar();
            SimpleDateFormat formatter = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
            Date dt = calendar.getTime();
           String ds1 = dt.toString();
           System.out.println("ds1 = " + ds1);
           String dateString = formatter.format(calendar.getTime());
           System.out.println("dateString = " + dateString );

    }
}

我不明白为什么 dateString 的年份部分显示为 2020 而不是 2019。

ds1 = Tue Dec 31 00:00:00 EST 2019
dateString = 2020-12-31 00:00:00

【问题讨论】:

  • 仅供参考,存在严重缺陷的日期时间类,例如 java.util.Datejava.util.CalendarGregorianCalendar,现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateTimeDateTimeFormatterXMLGregorianCalendar 也很旧,您可以考虑现代课程是否不是更好的选择。

标签: java date xmlgregoriancalendar


【解决方案1】:

请将您的代码更改为

import javax.xml.datatype.XMLGregorianCalendar;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {

            XMLGregorianCalendar xmlDate = new XMLGregorianCalendarImpl();
            xmlDate.setMonth(12);
            xmlDate.setDay(31);
            xmlDate.setYear(2019);
            xmlDate.setHour(0);
            xmlDate.setMinute(0);
            xmlDate.setSecond(0);
            Calendar calendar = xmlDate.toGregorianCalendar();
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date dt = calendar.getTime();
           String ds1 = dt.toString();
           System.out.println("ds1 = " + ds1);
           String dateString = formatter.format(calendar.getTime());
           System.out.println("dateString = " + dateString );

    }
}

因为 YYYY 代表一周中的年份,而 yyyy 代表简单日期格式的日历年。

更多解释在这里:Java SimpleDateFormat shifts Date by one year

【讨论】:

  • 天啊。好的。我没有意识到这一点。 SMH。
  • 更容易使用java.timeLocalDate.of( 2019 , 12 , 31 ).atStartOfDay().toString().replace( "T" , "" )
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2017-01-27
  • 2018-05-11
  • 1970-01-01
  • 2018-09-23
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多