⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpledateformat.java

📁 kaffe是一个java虚拟机的源代码。里面包含了一些java例程和标准的java包。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	int startIndex = pos.getIndex();	int index = startIndex;	int endIndex = source.length();	int tzStart = -1, tzEnd = -1;	char[] patt = pattern.toCharArray();	for (int i = 0; i < patt.length; ) {		char letter = patt[i++];		if (letter == '\'') {			// quoted text			if ((i < patt.length) && (patt[i] == '\'')) {				if ((index >= endIndex) ||				    (source.charAt(index) != '\'')) {					pos.setIndex(startIndex);					pos.setErrorIndex(index);					return null;				}				index++;				i++;			}			else {				boolean done = false, error = false;				while (!done &&				       !error &&				       (i < patt.length) &&				       (index < endIndex) ) {					switch (patt[i]) {					case '\'':						if (((i + 1) < patt.length) &&						    (patt[i + 1] == '\'')) {							if (source.charAt(index) == '\'') {								index++;								i++;							} else {								System.out.println("hello - " + i + " " + index);								error = true;							}						} else {							done = true;						}						break;					default:						if( source.charAt(index) !=						    patt[i] ) {							System.out.println("hello 2 - " + i + " " + index);							error = true;						}						index++;						break;					}					i++;				}				if( error || (index >= endIndex) )				{					pos.setIndex(startIndex);					pos.setErrorIndex(index);					return null;				}				while ((i < patt.length) && patt[i] != '\'') {					if ((index >= endIndex) ||					    (source.charAt(index) != patt[i])) {						pos.setIndex(startIndex);						pos.setErrorIndex(index);						return null;					}					index++;					i++;				}				i++;			}		}		else if (((letter >= 'a') && (letter <= 'z')) ||			 ((letter >= 'A') && (letter <= 'Z'))) {			// pattern Code			int plen = 1;			int val = -1;						// count pattern len			while ((i < patt.length) && (patt[i] == letter)) {				plen++;				i++;			}						// skip blanks			for (;;) {				if (index >= endIndex) {					pos.setIndex(startIndex);					pos.setErrorIndex(index);					return null;				}				char c = source.charAt(index);				if ((c != ' ') && (c != '\t'))					break;				index++;			}			pos.setIndex(index);			// handle numeric values			if ((NUMERIC_PATTERN.indexOf(letter) != -1) ||			    ((letter == 'M') && (plen <= 2))) {				Number number;				if ((i < patt.length) &&				    (DEFAULTPATTERNCHARS.indexOf(patt[i]) != -1)) {					if (index + plen > endIndex) {						pos.setIndex(startIndex);						pos.setErrorIndex(index);						return null;					}					number = numberFormat.parse(source.substring(0, index + plen), pos);				}				else {					number = numberFormat.parse(source, pos);				}				if (number == null) {					pos.setIndex(startIndex);					pos.setErrorIndex(index);					return null;				}				val = number.intValue();				switch (letter) {				case 'y':					// 2 digits and only 2 digits					if( (plen < 3) &&					    (val >= 0) &&					    (pos.getIndex() - index <= 2) )					{						// The year is ambiguous,						// adjust century to be within						// 80 years before and 20 years						// after current time						int current = Calendar.getInstance().get(Calendar.YEAR);						int epoch = current - current % 100;						int year = epoch + val;												if (year > current + 20)							year -= 100;						else if (year < current - 80)							year += 100;						val = year;					}					break;				case 'M':					val--;					break;				case 'k':					if (val == 24)						val = 0;					break;				case 'h':					if (val == 12)						val = 0;					break;				}				calendar.set (NUMERIC_FIELD[NUMERIC_PATTERN.indexOf(letter) + 1],					      val);				index = pos.getIndex();			}			// handle strings values			else {				switch (letter) {				case 'G':					index = parseField (source, index, Calendar.ERA, syms.eras);					break;				case 'M':					index = parseField (source, index, Calendar.MONTH, syms.months);					if (index <= 0)						index = parseField (source, -index, Calendar.MONTH, syms.shortMonths);					break;				case 'E':					index = parseField (source, index, Calendar.DAY_OF_WEEK, syms.weekdays);					if (index <= 0)						index = parseField (source, -index, Calendar.DAY_OF_WEEK, syms.shortWeekdays);					break;				case 'a':					index = parseField (source, index, Calendar.AM_PM, syms.amPmStrings);					break;				case 'z':					tzStart = index;					index = parseTimeZone (source, index, endIndex);					tzEnd = index;					break;				default:					index = -index;				}				if (index <= 0) {					pos.setIndex(startIndex);					pos.setErrorIndex(-index);					return null;				}				pos.setIndex(index);			}		}		else {			// match literal			if ((index >= endIndex) ||			    (source.charAt(index) != letter)) {				pos.setIndex(startIndex);				pos.setErrorIndex(index);				return null;			}			index++;		}	}	if( tzStart != -1 )	{		// We have all the info we're gonna get, patch up the		// the time zone.		reallyParseTimeZone(source, tzStart, tzEnd);	}	pos.setIndex (index);	return calendar.getTime();}private int parseField (String source, int start, int field, String[] data) {	int best = -1;	int bestLen = 0;		for (int i = data.length; i-- > 0; ) {		int len = data[i].length();		if ((len > bestLen) &&		    source.regionMatches (true, start, data[i], 0, len)) {			best = i;			bestLen = len;		}	}	if (best >= 0) {		calendar.set (field, best);		return start + bestLen;	}	return -start;}private void reallyParseTimeZone (String source, int start, int endIndex) {		if (source.regionMatches (start, "GMT", 0, 3)) {		// GMT +/- ##:##, `should' work fine.		return;	}	// Redo localized if it applies	int bestZone = -1;	int bestLen = 0;	int bestType = 0;	for (int i = 0; i < syms.zoneStrings.length; i++) {		String[] zone = syms.zoneStrings[i];		for (int j = 1; j <= 4; j++) {			int len = zone[j].length();			if ((len > bestLen) &&			    source.regionMatches (true, start, zone[j], 0, len)) {				bestZone = i;				bestType = j;				bestLen = len;			}		}	}	if (bestZone != -1) {		TimeZone tz = TimeZone.getTimeZone (syms.zoneStrings[bestZone][bestType]);		long offset;		// Get the real offset, including DST adjustments.		offset = tz.getOffset(calendar.get(Calendar.ERA),				      calendar.get(Calendar.YEAR),				      calendar.get(Calendar.MONTH),				      calendar.get(Calendar.DAY_OF_MONTH),				      calendar.get(Calendar.DAY_OF_WEEK),				      calendar.get(Calendar.MILLISECOND));		calendar.set(Calendar.ZONE_OFFSET, (int)offset);		return;	}	// its RFC 822 +hhmm format	return;}private int parseTimeZone (String source, int start, int endIndex) {	// XXX better handle DST_OFFSET if tz.useDaylightTime() ?	calendar.set(Calendar.DST_OFFSET, 0);	if (source.regionMatches (start, "GMT", 0, 3)) {		int index = start + 3;		int sign = 0;		if (index < endIndex) {			switch (source.charAt(index)) {			case '+':				sign = +1;				break;			case '-':				sign = -1;			}		}		if (sign == 0) {			calendar.set(Calendar.ZONE_OFFSET, 0);			return index;		}		ParsePosition pos = new ParsePosition(index + 1);		Number num = numberFormat.parse (source, pos);		if (num == null)			return -start;		int offset = num.intValue();		if ((pos.getIndex() < endIndex) &&		    (source.charAt(pos.getIndex()) == ':')) {			// GMT+hh:mm			offset *= 60;			pos.setIndex(pos.getIndex() + 1);			num = numberFormat.parse (source, pos);			if (num == null)				return -start;			offset += num.intValue();		}		else {			// GMT+hh[mm]			if (offset < 24)				offset *= 60;			else				offset = (offset / 100) * 60 + offset % 100;		}		offset *= 60 * 1000;		if (sign == -1)			offset = -offset;		calendar.set(Calendar.ZONE_OFFSET, offset);		return pos.getIndex();	}	// search localized timezone	int bestZone = -1;	int bestLen = 0;	int bestType = 0;	for (int i = 0; i < syms.zoneStrings.length; i++) {		String[] zone = syms.zoneStrings[i];		for (int j = 1; j <= 4; j++) {			int len = zone[j].length();			if ((len > bestLen) &&			    source.regionMatches (true, start, zone[j], 0, len)) {				bestZone = i;				bestType = j;				bestLen = len;			}		}	}	if (bestZone != -1) {		TimeZone tz = TimeZone.getTimeZone (syms.zoneStrings[bestZone][bestType]);		// XXX Ugh, this is messy...  Basically, we can't tell whether		// DST applies or not, so we have to wait till later to		// figure it out.		calendar.set(Calendar.ZONE_OFFSET, 0);		return start + bestLen;	}	// try RFC 822 +hhmm format	DecimalFormat rfc822 = new DecimalFormat("+####;-####");	rfc822.setParseIntegerOnly(true);	rfc822.setGroupingUsed(false);	ParsePosition pos = new ParsePosition (start);	Number num = rfc822.parse (source, pos);	if (num == null)		return -start;	int offset = num.intValue();	int sign = 1;	if (offset < 0) {		sign = -1;		offset = -offset;	}	if (offset < 24)		offset *= 60;	else		offset = (offset / 100) * 60 + offset % 100;	offset *= 60 * 1000;	if (sign == -1)		offset = -offset;	calendar.set(Calendar.ZONE_OFFSET, offset);	return pos.getIndex();}public void setDateFormatSymbols(DateFormatSymbols syms) {	this.syms = syms;}public String toLocalizedPattern() {	StringBuffer buf = new StringBuffer();	String locals = syms.getLocalPatternChars();	for (int i = 0; i < pattern.length(); i++) {		int idx = DEFAULTPATTERNCHARS.indexOf(pattern.charAt(i));		if (idx >= 0) {			buf.append(locals.charAt(idx));		}		else {			buf.append(pattern.charAt(i));		}	}	return (buf.toString());}public String toPattern() {	return (pattern);}}

⌨️ 快捷键说明

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