java.util। XMLGregorian कैलेंडर में दिनांक




date xmlgregoriancalendar (7)

मान लें कि आप एक्सएमएल डीकोडिंग या एन्कोडिंग कर रहे हैं और JAXB का उपयोग कर रहे हैं, तो स्कीमा में प्रत्येक तारीख के लिए डेटटाइम को पूरी तरह बाध्यकारी करना और `XMLGregorianCalendar 'से कुछ और उपयोग करना संभव है।

इस तरह आप JAXB को दोहराए जाने वाले सामान कर सकते हैं, जबकि आप मूल्य प्रदान करने वाले समय को भयानक कोड लिखने में समय व्यतीत कर सकते हैं।

जोडाटाइम DateTime लिए उदाहरण: (java.util.Date के साथ ऐसा करना भी काम करेगा - लेकिन कुछ सीमाओं के साथ। मैं जोडाटाइम पसंद करता हूं और यह मेरे कोड से कॉपी किया गया है, इसलिए मुझे पता है कि यह काम करता है ...)

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

यहां देखें: तिथि के अनुसार XmlGregorian कैलेंडर को कैसे बदलें?

यदि आप टाइमज़ोन + टाइमस्टैम्प के आधार पर किसी तत्काल मानचित्र पर खुश हैं, और मूल टाइमज़ोन वास्तव में प्रासंगिक नहीं है, तो java.util.Date शायद ठीक है।

क्या java.util से मिलने का कोई सुविधाजनक तरीका नहीं है। किसी XMLGregorian कैलेंडर में डेट करें?


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

Joda-Time लाइब्रेरी का उपयोग करके एक पंक्ति उदाहरण:

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

स्वीकार्य उत्तर में उनकी टिप्पणी से निकोलस मॉमार्ट्स को क्रेडिट।


उन लोगों के लिए जो यहां विपरीत रूपांतरण की तलाश कर सकते हैं ( XMLGregorianCalendar से Date ):

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

इस कोड को देखें: -

/* 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);

आप here पूरा उदाहरण देख सकते हैं


मुझे उम्मीद है कि यहां मेरा एन्कोडिंग सही है; डी इसे तेजी से बनाने के लिए केवल कन्स्ट्रक्टर कॉल के बजाय ग्रेगोरियन कैलेंडर की बदसूरत getInstance () कॉल का उपयोग करें:

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

}

बस सोचा कि मैं नीचे अपना समाधान जोड़ूंगा, क्योंकि ऊपर दिए गए उत्तरों मेरी सटीक जरूरतों को पूरा नहीं करते थे। मेरी एक्सएमएल स्कीमा को अलग-अलग दिनांक और समय तत्वों की आवश्यकता होती है, गायक डेटटाइम फ़ील्ड नहीं। ऊपर उपयोग किए गए मानक XMLGregorian कैलेंडर नियंत्रक एक दिनांक समय फ़ील्ड उत्पन्न करेगा

ध्यान दें कि गोथका के कुछ जोड़े हैं, जैसे कि महीने में एक जोड़ना (क्योंकि जावा 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);




xmlgregoriancalendar