private static bool ParseTimeZoneOffset(ref __DTString str, int len, ref TimeSpan result) {
bool isPositive = true;
int hourOffset;
int minuteOffset = 0;
switch (len) {
case 1:
case 2:
if (!ParseSign(ref str, ref isPositive)) {
return (false);
}
if (!ParseDigits(ref str, len, out hourOffset)) {
return (false);
}
break;
default:
if (!ParseSign(ref str, ref isPositive)) {
return (false);
}
// Parsing 1 digit will actually parse 1 or 2.
if (!ParseDigits(ref str, 1, out hourOffset)) {
return (false);
}
// ':' is optional.
if (str.Match(":")) {
// Found ':'
if (!ParseDigits(ref str, 2, out minuteOffset)) {
return (false);
}
} else {
// Since we can not match ':', put the char back.
str.Index--;
if (!ParseDigits(ref str, 2, out minuteOffset)) {
return (false);
}
}
break;
}
if (minuteOffset < 0 || minuteOffset >= 60) {
return false;
}
result = (new TimeSpan(hourOffset, minuteOffset, 0));
if (!isPositive) {
result = result.Negate();
}
return (true);
}