java.util.Date to XMLGregorianCalendar

499

Нет ли удобного способа перехода из java.util.Date в XMLGregorianCalendar?

Теги:
date
xmlgregoriancalendar

8 ответов

895
Лучший ответ
GregorianCalendar c = new GregorianCalendar();
c.setTime(yourDate);
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
  • 4
    Сохраняется ли сохранение в качестве статической переменной getInstance () в каком-либо классе преобразователя? Я пытался найти его в JavaDoc, но ничего не смог найти. Вроде сложно понять, будут ли проблемы при одновременном использовании?
  • 34
    Если вы хотите использовать JodaTime, вы можете сделать это в одной строке: DatatypeFactory.newInstance (). NewXMLGregorianCalendar (new DateTime (). ToGregorianCalendar ())
Показать ещё 4 комментария
194

Для тех, кто может найти здесь обратное преобразование (от XMLGregorianCalendar до Date):

XMLGregorianCalendar xcal = <assume this is initialized>;
java.util.Date dt = xcal.toGregorianCalendar().getTime();
30

Вот способ преобразования из GregorianCalendar в XMLGregorianCalendar; Я оставлю часть преобразования из java.util.Date в GregorianCalendar в качестве упражнения для вас:

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);
   }

}

EDIT: Slooow: -)

  • 5
    Это решение для преобразования GregorianCalendar в XMLGregorianCalendar, а не то, что указано в вопросе
19

Пример из одной строки с использованием Joda-Time:

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

Кредит Nicolas Mommaerts из его комментария в принятом ответе.

12

Просто подумал, что добавлю свое решение ниже, так как приведенные выше ответы не соответствовали моим конкретным потребностям. В моей схеме Xml требуются отдельные элементы Date и Time, а не однопользовательское поле DateTime. Стандартный конструктор 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);
10

Надеюсь, моя кодировка верна, D Чтобы сделать это быстрее, просто используйте уродливый вызов getInstance() GregorianCalendar вместо вызова конструктора:

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 {
      // do not forget the type cast :/
      GregorianCalendar gcal = (GregorianCalendar) GregorianCalendar.getInstance();
      XMLGregorianCalendar xgcal = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(gcal);
      System.out.println(xgcal);
   }

}
  • 13
    -1 для использования .getInstance (). GregorianCalendar.getInstance() является эквивалентом Calendar.getInstance() . Calendar.getInstance() не может сделать это быстрее, потому что он использует тот же new GregorianCalendar() , но прежде чем он также проверяет локаль по умолчанию и может вместо этого создать японский или буддийский календарь, поэтому для некоторых счастливых пользователей это будет ClassCastException !
4

Предполагая, что вы декодируете или кодируете xml и используете JAXB, тогда можно полностью заменить привязку dateTime и использовать любую другую, чем `XMLGregorianCalendar 'для каждой даты в схеме.

Таким образом, вы можете иметь JAXB повторяющиеся вещи, в то время как вы можете потратить время на создание замечательного кода, который поставляет значение.

Пример для jodatime DateTime: (Выполнение этого с помощью java.util.Date также будет работать, но с определенными ограничениями. Я предпочитаю jodatime, и он копируется из моего кода, поэтому я знаю, что он работает...)

<jxb:globalBindings>
    <jxb:javaType name="org.joda.time.LocalDateTime" xmlType="xs:dateTime"
        parseMethod="test.util.JaxbConverter.parseDateTime"
        printMethod="se.seb.bis.test.util.JaxbConverter.printDateTime" />
    <jxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date"
        parseMethod="test.util.JaxbConverter.parseDate"
        printMethod="test.util.JaxbConverter.printDate" />
    <jxb:javaType name="org.joda.time.LocalTime" xmlType="xs:time"
        parseMethod="test.util.JaxbConverter.parseTime"
        printMethod="test.util.JaxbConverter.printTime" />
    <jxb:serializable uid="2" />
</jxb:globalBindings>

И конвертер:

public class JaxbConverter {
static final DateTimeFormatter dtf = ISODateTimeFormat.dateTimeNoMillis();
static final DateTimeFormatter df = ISODateTimeFormat.date();
static final DateTimeFormatter tf = ISODateTimeFormat.time();

public static LocalDateTime parseDateTime(String s) {
    try {
        if (StringUtils.trimToEmpty(s).isEmpty())
            return null;
        LocalDateTime r = dtf.parseLocalDateTime(s);
        return r;
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static String printDateTime(LocalDateTime d) {
    try {
        if (d == null)
            return null;
        return dtf.print(d);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static LocalDate parseDate(String s) {
    try {
        if (StringUtils.trimToEmpty(s).isEmpty())
            return null;
        return df.parseLocalDate(s);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static String printDate(LocalDate d) {
    try {
        if (d == null)
            return null;
        return df.print(d);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static String printTime(LocalTime d) {
    try {
        if (d == null)
            return null;
        return tf.print(d);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

public static LocalTime parseTime(String s) {
    try {
        if (StringUtils.trimToEmpty(s).isEmpty())
            return null;
        return df.parseLocalTime(s);
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}

Смотрите здесь: как заменить XmlGregorianCalendar по дате?

Если вы счастливы только на мгновение отображать на основе часового пояса + отметки времени, а исходный часовой пояс не имеет особого значения, значит, java.util.Date, вероятно, тоже хорошо.

0

Проверьте этот код: -

/* Create Date Object */
Date date = new Date();
XMLGregorianCalendar xmlDate = null;
GregorianCalendar gc = new GregorianCalendar();

gc.setTime(date);

try{
    xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
}
catch(Exception e){
    e.printStackTrace();
}

System.out.println("XMLGregorianCalendar :- " + xmlDate);

Вы можете увидеть полный пример здесь

  • 0
    Я не думаю, что этот ответ не дает ничего нового. Возможно, вы можете отредактировать предыдущий ответ вместо того, чтобы публиковать другой почти такой же.
  • 0
    Как сделать dateFormat для XMLGregorianCalendar?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню