java.util.Date to XMLGregorianCalendar

Нет ли удобного способа получить из Java. Util. Дата в XMLGregorianCalendar?

вопрос задан 7.05.2009
mac
5066 репутация

8 ответов


  • 971 рейтинг
    GregorianCalendar c = new GregorianCalendar();
    c.setTime(yourDate);
    XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
    
    ответ дан Ben Noland, с репутацией 20781, 7.05.2009
  • 199 рейтинг

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

    XMLGregorianCalendar xcal = ;
    java.util.Date dt = xcal.toGregorianCalendar().getTime();
    
    ответ дан Nuno Furtado, с репутацией 3749, 4.01.2011
  • 29 рейтинг

    Вот метод для преобразования из GregorianCalendar в XMLGregorianCalendar; Я оставлю часть конвертации из Java. Util. Дата для 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);
       }
    
    }
    

    РЕДАКТИРОВАТЬ: Slooow :-)

    ответ дан sasuke, с репутацией 2541, 7.05.2009
  • 21 рейтинг

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

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

    Благодарность Николаю Момартсу от его комментария в принят ответ .

    ответ дан Chris Knight, с репутацией 16081, 3.02.2014
  • 12 рейтинг

    Просто подумал, что добавлю свое решение ниже, поскольку ответы выше не соответствуют моим точным потребностям. Моя схема XML требует отдельных элементов Date и Time, а не одного поля DateTime. Стандартный конструктор XMLGregorianCalendar, использованный выше, сгенерирует поле DateTime

    Обратите внимание, что есть пара готок, например, добавление одного к месяцу (так как 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);
    
    ответ дан khylo, с репутацией 3854, 16.03.2011
  • 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);
       }
    
    }
    
    ответ дан Daniel K., с репутацией 109, 21.09.2010
  • 4 рейтинг

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

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

    Пример для jodatime DateTime: (Делаем это с Java. Util. Дата также будет работать - но с некоторыми ограничениями. Я предпочитаю jodatime, и он скопирован из моего кода, поэтому я знаю, что он работает. , , )

    
        
        
        
        
    
    

    и преобразователь:

    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 тоже подойдет.

    ответ дан KarlP, с репутацией 4156, 22.04.2013
  • 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);
    

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

    ответ дан Akash, с репутацией 19, 24.03.2017