有 Java 编程相关的问题?

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


共 (6) 个答案

  1. # 1 楼答案

    我只是想在下面添加我的解决方案,因为上面的答案不符合我的确切需求。我的Xml模式需要单独的日期和时间元素,而不是一个单独的日期时间字段。上面使用的标准XMLGregorianCalendar构造函数将生成一个DateTime字段

    注意这里有几个gothca,比如必须在月份中添加一个(因为java从0开始计算月份)

    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(yourDate);
    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), 0);
    XMLGregorianCalendar xmlTime = DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0);
    
  2. # 2 楼答案

    使用Joda-Time库的一行示例:

    XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(new DateTime().toGregorianCalendar());
    

    他在the accepted answer中的评论归功于Nicolas Mommaerts

  3. # 3 楼答案

    下面是一种将GregorianCalendar转换为XMLGregorianCalendar的方法;我将留下从java转换的部分。util。与Gregorianalendar约会,作为你的练习:

    import java.util.GregorianCalendar;
    
    import javax.xml.datatype.DatatypeFactory;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    public class DateTest {
    
       public static void main(final String[] args) throws Exception {
          GregorianCalendar gcal = new GregorianCalendar();
          XMLGregorianCalendar xgcal = DatatypeFactory.newInstance()
                .newXMLGregorianCalendar(gcal);
          System.out.println(xgcal);
       }
    
    }
    

    编辑:Sloow:-)

  4. # 4 楼答案

    对于那些可能最终在这里寻找相反转换(从XMLGregorianCalendarDate)的人:

    XMLGregorianCalendar xcal = <assume this is initialized>;
    java.util.Date dt = xcal.toGregorianCalendar().getTime();
    
  5. # 5 楼答案

    我想退一步,用现代的眼光来看待这个10年前的问题。上面提到的类DateXMLGregorianCalendar现在已经很旧了。我对它们的使用提出质疑,并提供替代方案

    • Date的设计总是很糟糕,而且已经有20多年的历史了。这很简单:不要使用它
    • XMLGregorianCalendar也很古老,设计也很老式。据我所知,它用于以XML格式为XML文档生成日期和时间。比如2009-05-07T19:05:45.678+02:00或者2009-05-07T17:05:45.678Z。这些格式与ISO 8601非常一致,即java的类。现代Java日期和时间API time可以生成我们更喜欢的数据和时间

    不需要转换

    对很多人来说(大多数?)目的Date的现代替代品将是Instant。一个Instant是一个时间点(就像一个Date一样)

        Instant yourInstant = // ...
        System.out.println(yourInstant);
    

    此代码段的输出示例如下:

    2009-05-07T17:05:45.678Z

    这与上面我的示例XMLGregorianCalendar字符串的后一个相同。正如你们大多数人所知,它来自Instant.toStringSystem.out.println隐式调用。用java。时间,在许多情况下,我们不需要以前在DateCalendarXMLGregorianCalendar和其他类之间进行的转换(在某些情况下,我们确实需要转换,不过,我在下一节中向您展示一些转换)

    控制偏移量

    无论是Date还是Instant都没有时区或UTC偏移量。Ben Noland之前接受的、投票率仍然最高的答案使用JVM当前的默认时区来选择XMLGregorianCalendar的偏移量。为了在现代对象中包含偏移量,我们使用OffsetDateTime。例如:

        ZoneId zone = ZoneId.of("America/Asuncion");
        OffsetDateTime dateTime = yourInstant.atZone(zone).toOffsetDateTime();
        System.out.println(dateTime);
    

    2009-05-07T13:05:45.678-04:00

    这同样符合XML格式。如果要再次使用当前的JVM时区设置,请将zone设置为ZoneId.systemDefault()

    如果我真的需要一个XMLGregorianCalendar呢

    有更多的方法可以将Instant转换为XMLGregorianCalendar。我将介绍几个例子,每个都有其优点和缺点。首先,正如XMLGregorianCalendar生成类似2009-05-07T17:05:45.678Z的字符串一样,它也可以从这样的字符串构建:

        String dateTimeString = yourInstant.toString();
        XMLGregorianCalendar date2
                = DatatypeFactory.newInstance().newXMLGregorianCalendar(dateTimeString);
        System.out.println(date2);
    

    2009-05-07T17:05:45.678Z

    赞成者:它很短,我认为它不会给人任何惊喜。缺点:对我来说,将瞬间格式化为字符串并重新解析它就像是一种浪费

        ZonedDateTime dateTime = yourInstant.atZone(zone);
        GregorianCalendar c = GregorianCalendar.from(dateTime);
        XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
        System.out.println(date2);
    

    2009-05-07T13:05:45.678-04:00

    赞成者:这是官方的转换。控制偏移量是自然而然的。缺点:它需要更多的步骤,因此更长

    如果我们有约会呢

    如果您从旧式API获得了一个过时的Date对象,而您现在无法更改它,请将其转换为Instant

        Instant i = yourDate.toInstant();
        System.out.println(i);
    

    输出与之前相同:

    2009-05-07T17:05:45.678Z

    如果要控制偏移量,请按上述方法进一步转换为OffsetDateTime

    如果你有一个老式的Date并且绝对需要一个老式的XMLGregorianCalendar,只需使用Ben Noland的答案

    链接

  6. # 6 楼答案

    GregorianCalendar c = new GregorianCalendar();
    c.setTime(yourDate);
    XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);