有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Long到XMLGregorianCalendar和back到Long

我试图将毫秒时间戳转换为XMLGregorianCalendar,然后再转换回来,但我似乎得到了错误的结果。我做错什么了吗?看来我的日子越来越长了

    // Time stamp   01-Jan-0001 00:00:00.000
    Long ts = -62135740800000L;
    System.out.println(ts);
    System.out.println(new Date(ts)); // Sat Jan 01 00:00:00 PST 1 .. Cool!

    // to Gregorian Calendar
    GregorianCalendar gc = new GregorianCalendar();
    gc.setTimeInMillis(ts);

    // to XML Gregorian Calendar
    XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);

    // back to GC
    GregorianCalendar gc2 = xc.toGregorianCalendar();

    // to Timestamp
    Long newTs = gc2.getTimeInMillis();
    System.out.println(newTs);    //  -62135568000000  .. uh?
    System.out.println(new Date(newTs));  // Mon Jan 03 00:00:00 PST 1  .. where did the extra days come from?

共 (2) 个答案

  1. # 1 楼答案

    我相信这就是问题所在。根据文档,toGregorianCalendar()在缺少任何字段时,依赖于GregorianCalendar相应的默认值进行转换

    如果您尝试:

    Date date = new Date();
    long ts = date.getTime(); //in place of your input
    

    然后运行您的代码,您应该会发现tofrom转换都可以正常工作

    如果您希望您的toGregorianCalendar()与示例中一样提供自定义输入,请使用toGregorianCalendar(TimeZone,Locale,Defaults)并提供更新后的默认值以用于转换

  2. # 2 楼答案

    有趣的是,对于小于(约)-100000000000L(和正值)的值,它可以正常工作,但较大的负值会变得不一致

    如果打印出gcxcgc2,您可以看到问题出现的地方(从XMLGregorianCalendar到GregorianCalendar的转换)

    gc:  java.util.GregorianCalendar[time=-62135740800000 ... DAY_OF_WEEK=7
    xc:  0001-01-01T08:00:00.000Z
    gc2: java.util.GregorianCalendar[time=? ... DAY_OF_WEEK=5
    

    如果打印出xc的字段,则得到1,1,1

        System.out.println(xc.getYear());
        System.out.println(xc.getMonth());
        System.out.println(xc.getDay());
    

    对于gc2,得到1,0,1(与xc匹配,因为月份在GregorianCalendar中是零)

        System.out.println(gc2.get(gc2.YEAR));
        System.out.println(gc2.get(gc2.MONTH));
        System.out.println(gc2.get(gc2.DAY_OF_MONTH));
    

    但是,添加这些3println调用会更改打印输出gc2来自gc2time=?输出更改为time=-62135568000000,因此通过查询GregorianCalendar对象触发了一些计算;areFieldsSet属性也从false更改为true

    两个GregoriaCalendar的时区不同,但这并不能解释错误,即使设置了明确的时区和区域设置,错误也会持续存在