📄 simpledateformat.java
字号:
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 + -