private static double Date_parseString(string s)
{
try
{
if (s.Length == 24)
{
DateTime d;
lock (isoFormat)
{
d = isoFormat.Parse(s);
}
return d.GetTime();
}
}
catch (ParseException)
{
}
int year = -1;
int mon = -1;
int mday = -1;
int hour = -1;
int min = -1;
int sec = -1;
char c = 0;
char si = 0;
int i = 0;
int n = -1;
double tzoffset = -1;
char prevc = 0;
int limit = 0;
bool seenplusminus = false;
limit = s.Length;
while (i < limit)
{
c = s[i];
i++;
if (c <= ' ' || c == ',' || c == '-')
{
if (i < limit)
{
si = s[i];
if (c == '-' && '0' <= si && si <= '9')
{
prevc = c;
}
}
continue;
}
if (c == '(')
{
int depth = 1;
while (i < limit)
{
c = s[i];
i++;
if (c == '(')
{
depth++;
}
else
{
if (c == ')')
{
if (--depth <= 0)
{
break;
}
}
}
}
continue;
}
if ('0' <= c && c <= '9')
{
n = c - '0';
while (i < limit && '0' <= (c = s[i]) && c <= '9')
{
n = n * 10 + c - '0';
i++;
}
if ((prevc == '+' || prevc == '-'))
{
seenplusminus = true;
if (n < 24)
{
n = n * 60;
}
else
{
n = n % 100 + n / 100 * 60;
}
if (prevc == '+')
{
n = -n;
}
if (tzoffset != 0 && tzoffset != -1)
{
return ScriptRuntime.NaN;
}
tzoffset = n;
}
else
{
if (n >= 70 || (prevc == '/' && mon >= 0 && mday >= 0 && year < 0))
{
if (year >= 0)
{
return ScriptRuntime.NaN;
}
else
{
if (c <= ' ' || c == ',' || c == '/' || i >= limit)
{
year = n < 100 ? n + 1900 : n;
}
else
{
return ScriptRuntime.NaN;
}
}
}
else
{
if (c == ':')
{
if (hour < 0)
{
hour = n;
}
else
{
if (min < 0)
{
min = n;
}
else
{
return ScriptRuntime.NaN;
}
}
}
else
{
if (c == '/')
{
if (mon < 0)
{
mon = n - 1;
}
else
{
if (mday < 0)
{
mday = n;
}
else
{
return ScriptRuntime.NaN;
}
}
}
else
{
if (i < limit && c != ',' && c > ' ' && c != '-')
{
return ScriptRuntime.NaN;
}
else
{
if (seenplusminus && n < 60)
{
if (tzoffset < 0)
{
tzoffset -= n;
}
else
{
tzoffset += n;
}
}
else
{
if (hour >= 0 && min < 0)
{
min = n;
}
else
{
if (min >= 0 && sec < 0)
{
sec = n;
}
else
{
if (mday < 0)
{
mday = n;
}
else
{
return ScriptRuntime.NaN;
}
}
}
}
}
}
}
}
}
prevc = (char)0;
}
else
{
if (c == '/' || c == ':' || c == '+' || c == '-')
{
prevc = c;
}
else
{
int st = i - 1;
while (i < limit)
{
c = s[i];
if (!(('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')))
{
break;
}
i++;
}
int letterCount = i - st;
if (letterCount < 2)
{
return ScriptRuntime.NaN;
}
string wtb = "am;pm;" + "monday;tuesday;wednesday;thursday;friday;" + "saturday;sunday;" + "january;february;march;april;may;june;" + "july;august;september;october;november;december;" + "gmt;ut;utc;est;edt;cst;cdt;mst;mdt;pst;pdt;";
int index = 0;
for (int wtbOffset = 0; ; )
{
int wtbNext = wtb.IndexOf(';', wtbOffset);
if (wtbNext < 0)
{
return ScriptRuntime.NaN;
}
if (wtb.RegionMatches(true, wtbOffset, s, st, letterCount))
{
break;
}
wtbOffset = wtbNext + 1;
++index;
}
if (index < 2)
{
if (hour > 12 || hour < 0)
{
return ScriptRuntime.NaN;
}
else
{
if (index == 0)
{
// AM
if (hour == 12)
{
hour = 0;
}
}
else
{
// PM
if (hour != 12)
{
hour += 12;
}
}
}
}
else
{
if ((index -= 2) < 7)
{
}
else
{
// ignore week days
if ((index -= 7) < 12)
{
// month
if (mon < 0)
{
mon = index;
}
else
{
return ScriptRuntime.NaN;
}
}
else
{
index -= 12;
switch (index)
{
case 0:
{
// timezones
tzoffset = 0;
break;
}
case 1:
{
tzoffset = 0;
break;
}
case 2:
{
tzoffset = 0;
break;
}
case 3:
{
tzoffset = 5 * 60;
break;
}
case 4:
{
tzoffset = 4 * 60;
break;
}
case 5:
{
tzoffset = 6 * 60;
break;
}
case 6:
{
tzoffset = 5 * 60;
break;
}
case 7:
{
tzoffset = 7 * 60;
break;
}
case 8:
{
tzoffset = 6 * 60;
break;
}
case 9:
{
tzoffset = 8 * 60;
break;
}
case 10:
{
tzoffset = 7 * 60;
break;
}
default:
{
Kit.CodeBug();
break;
}
}
}
}
}
}
}
}
if (year < 0 || mon < 0 || mday < 0)
{
return ScriptRuntime.NaN;
}
if (sec < 0)
{
sec = 0;
}
if (min < 0)
{
min = 0;
}
if (hour < 0)
{
hour = 0;
}
double msec = Date_msecFromDate(year, mon, mday, hour, min, sec, 0);
if (tzoffset == -1)
{
return InternalUTC(msec);
}
else
{
return msec + tzoffset * msPerMinute;
}
}