xmlgregoriancalendarimpl.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,872 行 · 第 1/5 页

JAVA
1,872
字号
	String lexRep = lexicalRepresentation;	final int NOT_FOUND = -1;	int lexRepLength = lexRep.length();			// current parser needs a format string,	// use following heuristics to figure out what xml schema date/time	// datatype this lexical string could represent.	if (lexRep.indexOf('T') != NOT_FOUND) {	    // found Date Time separater, must be xsd:DateTime	    format = "%Y-%M-%DT%h:%m:%s" + "%z";	} else if (lexRepLength >= 3 && lexRep.charAt(2) == ':') {	    // found ":", must be xsd:Time	    format = "%h:%m:%s" +"%z";	} else if (lexRep.startsWith("--")) {	    // check for GDay || GMonth || GMonthDay	    if (lexRepLength >= 3 && lexRep.charAt(2) == '-') {		// GDAY		// Fix 4971612: invalid SCCS macro substitution in data string		format = "---%D" + "%z";	    } else if (lexRepLength >= 6 &&		       lexRep.charAt(5) == '-' && lexRep.charAt(4) == '-') {		// GMonth		// Fix 4971612: invalid SCCS macro substitution in data string		format = "--%M--%z";	    } else {		// GMonthDay or invalid lexicalRepresentation		format = "--%M-%D" + "%z";	    }	} else {	    // check for Date || GYear | GYearMonth	    int countSeparator = 0;	    // start at index 1 to skip potential negative sign for year.	    	    	    int timezoneOffset = lexRep.indexOf(':');	    if (timezoneOffset != NOT_FOUND) {		// found timezone, strip it off for distinguishing		// between Date, GYear and GYearMonth so possible		// negative sign in timezone is not mistaken as		// a separator.		lexRepLength -= 6;	    }	    	    for (int i=1; i < lexRepLength; i++) {		if (lexRep.charAt(i) == '-') {			countSeparator++;		}	    }	    if (countSeparator == 0) {		// GYear		format = "%Y" + "%z";	    } else if (countSeparator == 1) {		// GYearMonth		format = "%Y-%M" + "%z";	    } else {		// Date or invalid lexicalRepresentation		// Fix 4971612: invalid SCCS macro substitution in data string		format = "%Y-%M-%D" + "%z";	    }	}	Parser p = new Parser(format, lexRep);	p.parse();			// check for validity		if (!isValid()) {			throw new IllegalArgumentException(                DatatypeMessageFormatter.formatMessage(null,"InvalidXGCRepresentation", new Object[]{lexicalRepresentation})				//"\"" + lexicalRepresentation + "\" is not a valid representation of an XML Gregorian Calendar value."			);	    }    }    /**     * <p>Create an instance with all date/time datatype fields set to      * {@link DatatypeConstants#FIELD_UNDEFINED} or null respectively.</p>     */    public XMLGregorianCalendarImpl() {    	        // field initializers already do the correct initialization.    }    /**     * <p>Private constructor allowing for complete value spaces allowed by      * W3C XML Schema 1.0 recommendation for xsd:dateTime and related      * builtin datatypes. Note that <code>year</code> parameter supports     * arbitrarily large numbers and fractionalSecond has infinite      * precision.</p>     *      * @param year of <code>XMLGregorianCalendar</code> to be created.     * @param month of <code>XMLGregorianCalendar</code> to be created.     * @param day of <code>XMLGregorianCalendar</code> to be created.     * @param hour of <code>XMLGregorianCalendar</code> to be created.     * @param minute of <code>XMLGregorianCalendar</code> to be created.     * @param second of <code>XMLGregorianCalendar</code> to be created.     * @param fractionalSecond of <code>XMLGregorianCalendar</code> to be created.     * @param timezone of <code>XMLGregorianCalendar</code> to be created.     *      */    protected XMLGregorianCalendarImpl(        BigInteger year,        int month,        int day,        int hour,        int minute,        int second,        BigDecimal fractionalSecond,        int timezone) {        			setYear(year);        setMonth(month);        setDay(day);        setTime(hour, minute, second, fractionalSecond);		setTimezone(timezone);				// check for validity		if (!isValid()) {			            throw new IllegalArgumentException(                DatatypeMessageFormatter.formatMessage(null,                     "InvalidXGCValue-fractional",                     new Object[] { year, new Integer(month), new Integer(day),                     new Integer(hour), new Integer(minute), new Integer(second),                    fractionalSecond, new Integer(timezone)})			);                    			/**                String yearString = "null";                if (year != null) {                    yearString = year.toString();                }                String fractionalSecondString = "null";                if (fractionalSecond != null) {                    fractionalSecondString = fractionalSecond.toString();                }                             throw new IllegalArgumentException(                    "year = " + yearString                    + ", month = " + month                    + ", day = " + day                    + ", hour = " + hour                    + ", minute = " + minute                    + ", second = " + second                    + ", fractionalSecond = " + fractionalSecondString                    + ", timezone = " + timezone                    + ", is not a valid representation of an XML Gregorian Calendar value."                );                */            		}		    }    /**     * <p>Private constructor of value spaces that a     * <code>java.util.GregorianCalendar</code> instance would need to convert to an     * <code>XMLGregorianCalendar</code> instance.</p>     *         * <p><code>XMLGregorianCalendar eon</code> and      * <code>fractionalSecond</code> are set to <code>null</code></p>     *     * @param year of <code>XMLGregorianCalendar</code> to be created.     * @param month of <code>XMLGregorianCalendar</code> to be created.     * @param day of <code>XMLGregorianCalendar</code> to be created.     * @param hour of <code>XMLGregorianCalendar</code> to be created.     * @param minute of <code>XMLGregorianCalendar</code> to be created.     * @param second of <code>XMLGregorianCalendar</code> to be created.     * @param millisecond of <code>XMLGregorianCalendar</code> to be created.     * @param timezone of <code>XMLGregorianCalendar</code> to be created.     */    private XMLGregorianCalendarImpl(        int year,        int month,        int day,        int hour,        int minute,        int second,		int millisecond,        int timezone) {        			setYear(year);        setMonth(month);        setDay(day);        setTime(hour, minute, second);		setTimezone(timezone);		setMillisecond(millisecond);		if (!isValid()) {		                        throw new IllegalArgumentException(                DatatypeMessageFormatter.formatMessage(null,                 "InvalidXGCValue-milli",                 new Object[] { new Integer(year), new Integer(month), new Integer(day),                 new Integer(hour), new Integer(minute), new Integer(second),                 new Integer(millisecond), new Integer(timezone)})                			);                /*                throw new IllegalArgumentException(                    "year = " + year                    + ", month = " + month                    + ", day = " + day                    + ", hour = " + hour                    + ", minute = " + minute                    + ", second = " + second                    + ", millisecond = " + millisecond                    + ", timezone = " + timezone                    + ", is not a valid representation of an XML Gregorian Calendar value."                    );                 */            		}    }    	/**	 * <p>Convert a <code>java.util.GregorianCalendar</code> to XML Schema 1.0 	 * representation.</p>	 *	 * <table border="2" rules="all" cellpadding="2">	 *   <thead>	 *     <tr>	 *       <th align="center" colspan="2">	 *          Field by Field Conversion from	 *          <code>java.util.GregorianCalendar</code> to this class 	 *       </th>	 *     </tr>	 *   </thead>	 *   <tbody>	 *     <tr>	 *        <th><code>javax.xml.datatype.XMLGregorianCalendar</code> field</th>	 *        <th><code>java.util.GregorianCalendar</code> field</th>	 *     </tr>	 *     <tr>	 *       <th>{@link #setYear(int)}</th>	 *       <th><code>ERA == GregorianCalendar.BC ? -YEAR : YEAR</code></th>	 *     </tr>	 *     <tr>	 *       <th>{@link #setMonth(int)}</th>	 *       <th><code>MONTH + 1</code></th>	 *     </tr>	 *     <tr>	 *       <th>{@link #setDay(int)}</th>	 *       <th><code>DAY_OF_MONTH</code></th>	 *     </tr>	 *     <tr>	 *       <th>{@link #setTime(int,int,int, BigDecimal)}</th>	 *       <th><code>HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND</code></th>	 *     </tr>	 *     <tr>	 *       <th>{@link #setTimezone(int)}<i>*</i></th>	 *       <th><code>(ZONE_OFFSET + DST_OFFSET) / (60*1000)</code><br/>	 *       <i>(in minutes)</i>	 *       </th>	 *     </tr>	 *   </tbody>	 * </table>	 * <p><i>*</i>conversion loss of information. It is not possible to represent 	 * a <code>java.util.GregorianCalendar</code> daylight savings timezone id in the 	 * XML Schema 1.0 date/time datatype representation.</p>	 * 	 * <p>To compute the return value's <code>TimeZone</code> field,	 * <ul>	 * <li>when <code>this.getTimezone() != DatatypeConstants.FIELD_UNDEFINED</code>,	 * create a <code>java.util.TimeZone</code> with a custom timezone id 	 * using the <code>this.getTimezone()</code>.</li>	 * <li>else use the <code>GregorianCalendar</code> default timezone value 	 * for the host is defined as specified by 	 * <code>java.util.TimeZone.getDefault()</code>.</li></p>     	 *	 * @param cal <code>java.util.GregorianCalendar</code> used to create <code>XMLGregorianCalendar</code>	 */	public XMLGregorianCalendarImpl(GregorianCalendar cal) {    		int year = cal.get(Calendar.YEAR);	if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {		year = -year;	}	this.setYear(year);		// Calendar.MONTH is zero based, XSD Date datatype's month field starts		// with JANUARY as 1.	this.setMonth(cal.get(Calendar.MONTH) + 1);	this.setDay(cal.get(Calendar.DAY_OF_MONTH));	this.setTime(		cal.get(Calendar.HOUR_OF_DAY),		cal.get(Calendar.MINUTE), 		cal.get(Calendar.SECOND),		cal.get(Calendar.MILLISECOND));		// Calendar ZONE_OFFSET and DST_OFFSET fields are in milliseconds.	int offsetInMinutes = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / (60 * 1000);	this.setTimezone(offsetInMinutes);	}    // Factories    /**     * <p>Create a Java representation of XML Schema builtin datatype <code>dateTime</code>.     * All possible fields are specified for this factory method.</p>     *      * @param year represents both high-order eons and low-order year.     * @param month of <code>dateTime</code>     * @param day of <code>dateTime</code>     * @param hours of <code>dateTime</code>     * @param minutes of <code>dateTime</code>     * @param seconds of <code>dateTime</code>     * @param fractionalSecond value of null indicates optional field is absent.     * @param timezone offset in minutes. {@link DatatypeConstants#FIELD_UNDEFINED} indicates optional field is not set.     *      * @return <code>XMLGregorianCalendar</code> created from parameter values.     *      * @see DatatypeConstants#FIELD_UNDEFINED     *     * @throws IllegalArgumentException if any parameter is outside value      * constraints for the field as specified in      * <a href="#datetimefieldmapping">date/time field mapping table</a>.     */    public static XMLGregorianCalendar createDateTime(        BigInteger year,        int month,        int day,        int hours,        int minutes,        int seconds,        BigDecimal fractionalSecond,        int timezone) {		return new XMLGregorianCalendarImpl(		year,		month, 		day, 		hours,		minutes,		seconds, 		fractionalSecond,		timezone);    }    /**     * <p>Create a Java instance of XML Schema builtin datatype dateTime.</p>     *      * @param year represents both high-order eons and low-order year.     * @param month of <code>dateTime</code>     * @param day of <code>dateTime</code>     * @param hour of <code>dateTime</code>     * @param minute of <code>dateTime</code>     * @param second of <code>dateTime</code>     *     * @return <code>XMLGregorianCalendar</code> created from parameter values.     *      * @throws IllegalArgumentException if any parameter is outside value constraints for the field as specified in      *   <a href="#datetimefieldmapping">date/time field mapping table</a>.     *      * @see DatatypeConstants#FIELD_UNDEFINED     */    public static XMLGregorianCalendar createDateTime(        int year,        int month,        int day,        int hour,        int minute,        int second) {        	        return new XMLGregorianCalendarImpl(            year,            month,            day,            hour,            minute,            second,            DatatypeConstants.FIELD_UNDEFINED,  //millisecond        	DatatypeConstants.FIELD_UNDEFINED //timezone        );    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?