/** * Parse date part and return index to next token (for time) * <ul> * <li>MMM DD, YYYY - Jan 31, 2011</li> * </ul> */ private int ParseDateMMMDDYYYY(string sdate, ref DateInfo info, List <DateToken> tokens) { info.DayOfMonth = ToNumeric(sdate, tokens[2]); // locate year for (int i = 3; i < tokens.Count; i++) { DateToken token = tokens[i]; switch (token.Type) { case DateToken.TType.NUMERIC: info.Year = ToYear((int)token); return(i + 1); case DateToken.TType.COMMA: case DateToken.TType.DASH: case DateToken.TType.WHITESPACE: case DateToken.TType.SLASH: break; default: throw new ArgumentException("failed to parse date, invalid date format: " + sdate); } } throw new ArgumentException("failed to parse date, invalid date format: " + sdate); }
/** * Normalize year */ private int ToYear(string sdate, DateToken tok) { if (tok.Type != DateToken.TType.NUMERIC) { throw new ArgumentException("failed to parse date, as unknown form: " + sdate); } else { return(ToYear((int)tok)); } }
/** * Parse date part and return index to next token (for time) * <ul> * <li>YYYYMMDD - ie 20080401</li> * <li>dd-MMM-YY - ie 23-Dec-07</li> * <li>dd-MMM-YYYY - ie 23-Dec-2007</li> * <li>YYYY-MM-dd - ie 2007-11-03</li> * <li>MM/dd/YY - ie 12/01/07</li> * <li>MM/dd/YYYY - ie 12/01/2007</li> * <li>dd/MM/YY - ie 01/12/07 (british)</li> * <li>dd/MM/YYYY - ie 01/12/2007 (british)</li> * </ul> */ private int ParseDateNN(string sdate, ref DateInfo info, List <DateToken> tokens) { var len = tokens.Count; int Inow = 0; DateToken T1 = tokens[0]; // YYYYMMDD case if (len == 1) { int yyyymmdd = (int)T1; info.Year = Bound(sdate, yyyymmdd / 10000, 1950, 9999); info.Month = Bound(sdate, (yyyymmdd / 100) % 100, 1, 12); info.DayOfMonth = Bound(sdate, yyyymmdd % 100, 1, 31); return(1); } DateToken T2 = tokens[Inow = SkipSeparator(tokens, Inow + 1)]; DateToken T3 = tokens[Inow = SkipSeparator(tokens, Inow + 1)]; // dd-MMM-yy case if (T2.Type == DateToken.TType.ALPHA) { info.Month = ToMonthOrDay((string)T2); info.DayOfMonth = Bound(sdate, ToNumeric(sdate, T1), 1, 31); info.Year = ToYear(sdate, T3); return(Inow + 1); } // yyyy-mm-dd case else if ((int)T1 > 1000) { info.Year = ToYear(sdate, T1); info.Month = Bound(sdate, ToNumeric(sdate, T2), 1, 12); info.DayOfMonth = Bound(sdate, ToNumeric(sdate, T3), 1, 31); return(Inow + 1); } // mm/dd/yy case else if (_convention == Convention.American) { info.DayOfMonth = Bound(sdate, ToNumeric(sdate, T2), 1, 31); info.Month = Bound(sdate, ToNumeric(sdate, T1), 1, 12); info.Year = ToYear(sdate, T3); return(Inow + 1); } // dd/mm/yy case else { info.DayOfMonth = Bound(sdate, ToNumeric(sdate, T1), 1, 31); info.Month = Bound(sdate, ToNumeric(sdate, T2), 1, 12); info.Year = ToYear(sdate, T3); return(Inow + 1); } }
/** * Determine timezone for this date */ private ZTimeZone GetTimezone(DateToken tok) { switch (tok.Type) { case DateToken.TType.Z: return(ZTimeZone.GMT); case DateToken.TType.ALPHA: return(new ZTimeZone((string)tok)); default: return(default(ZTimeZone)); } }
/** * Parse date part and return index to next token (for time) * <ul> * <li>DAY, dd MMM YYYY - ie Fri, 25 Jul 2008 10:38:41 GMT</li> * </ul> */ private int ParseDateHTTP(string sdate, ref DateInfo info, List <DateToken> tokens) { int Inow = 0; DateToken T2 = tokens[Inow = SkipSeparator(tokens, Inow + 1)]; DateToken T3 = tokens[Inow = SkipSeparator(tokens, Inow + 1)]; DateToken T4 = tokens[Inow = SkipSeparator(tokens, Inow + 1)]; // dd-MMM-yy case if (T3.Type == DateToken.TType.ALPHA) { info.Month = ToMonthOrDay((string)T3); info.DayOfMonth = Bound(sdate, ToNumeric(sdate, T2), 1, 31); info.Year = ToYear(sdate, T4); return(Inow + 1); } else { info.Month = Bound(sdate, ToNumeric(sdate, T3), 1, 12); info.DayOfMonth = Bound(sdate, ToNumeric(sdate, T2), 1, 31); info.Year = ToYear(sdate, T4); return(Inow + 1); } }
/** * Parse date part and return index to next token (for time) * <ul> * <li>HH:mm:ss - ie 23:10:00</li> * <li>HH:mm:ss:SSS - ie 23:10:00:100</li> * <li>HH:mm:ss.SSS - ie 23:10:00:100</li> * </ul> * Each of these formats can have a Z (for GMT) or timezone (EST) at the end of the * time string. */ private void ParseTime(string sdate, ref DateInfo info, List <DateToken> tokens, int Istart) { var len = tokens.Count; if (Istart == len) { return; } DateToken separator = tokens[Istart]; DateToken last = tokens[len - 1]; DateToken plast = tokens[len - 2]; if (separator.Type != DateToken.TType.WHITESPACE && separator.Type != DateToken.TType.T) { throw new ArgumentException("failed to parse date, as unknown time form: " + sdate); } int cap = 0; if (last.Type == DateToken.TType.NUMERIC) { cap = len; } else if (plast.Type == DateToken.TType.NUMERIC) { cap = len - 1; } else { cap = len - 2; } int Inow = Istart + 1; // get hours if (Inow < cap) { info.Hours = Bound(sdate, ToNumeric(sdate, tokens[Inow]), 0, 23); } // get minutes Inow = SkipSeparator(tokens, Inow + 1); if (Inow < cap) { info.Minutes = Bound(sdate, ToNumeric(sdate, tokens[Inow]), 0, 59); } // get seconds Inow = SkipSeparator(tokens, Inow + 1); if (Inow < cap) { info.Seconds = Bound(sdate, ToNumeric(sdate, tokens[Inow]), 0, 59); } // get milli seconds Inow = SkipSeparator(tokens, Inow + 1); if (Inow < cap) { var fraction = Bound(sdate, ToNumeric(sdate, tokens [Inow]), 0, 999999999); if (fraction <= 999) { info.Milliseconds = fraction; } else if (fraction <= 999999) { info.Milliseconds = fraction / 1000; } else { info.Milliseconds = fraction / 1000000; } } // get timezone info.Zone = GetTimezone(last); }