//过滤尾部空格
while((len>0) && (' ' szDateTime[len]))
len--;
if (len<0) return FALSE;
while(len>0){
char c szDateTime[len];
switch( GetTokenType(c))
{
case TT_Null: goto ParseDateTimeString_FALSE;
case TT_Number:
switch(timePart)
{
case TP_Second:
if (second<0 )
second c-'0';
else
second + (c-'0') * pw;
pw * 10;
break;
case TP_Minute:
if (minute<0 )
minute c-'0';
else
minute + (c-'0') * pw;
pw * 10;
break;
case TP_Hour:
if (hour<0 )
hour c-'0';
else
hour + (c-'0') * pw;
pw * 10;
break;
case TP_Day:
if (day<0 )
day c-'0';
else
day + (c-'0') * pw;
pw * 10;
break;
case TP_Month:
if (month<0 )
month c-'0';
else
month + (c-'0') * pw;
pw * 10;
break;
case TP_Year:
if (year<0 )
year c-'0';
else
year + (c-'0') * pw;
pw * 10;
break;
default:
return FALSE;
}
break;
case TT_Minus:
switch(timePart)
{
case TP_Second: //如果没有给定时间信息,则跳过,直接升级到日期
pw 1;
timePart TP_Month; //提升
day second;
second -1; //将解析到的秒信息改为日期信息
break;
case TP_Minute: goto ParseDateTimeString_FALSE;
case TP_Hour: goto ParseDateTimeString_FALSE;
case TP_Day:
pw 1;
timePart TP_Month; //提升
break;
case TP_Month:
pw 1;
timePart TP_Year; //提升
break;
case TP_Year: goto ParseDateTimeString_FALSE;
default: goto ParseDateTimeString_FALSE;
}
break;
case TT_Colon:
switch(timePart)
{
case TP_Second:
pw 1;
timePart TP_Minute; //提升
break;
case TP_Minute:
pw 1;
timePart TP_Hour; //提升
break;
case TP_Hour: goto ParseDateTimeString_FALSE;
case TP_Day: goto ParseDateTimeString_FALSE;
case TP_Month: goto ParseDateTimeString_FALSE;
case TP_Year: goto ParseDateTimeString_FALSE;
default: goto ParseDateTimeString_FALSE;
}
break;
case TT_Blank:
if (TP_Hour timePart){
timePart TP_Day; //提升
pw 1;
}else if (TP_Year timePart){ //前导空格
goto ParseDateTimeString_OK;//认为结束
}else{//在其他部分不能出现空格
goto ParseDateTimeString_FALSE;
}
break;
}
len -- ;
}
ParseDateTimeString_OK:
if (year>0)
sYear year;
if (month>0)
sMonth month;
if (day>0)
sDay day;
if (hour>0)
sHour hour;
if (minute>0)
sMinute minute;
if (second>0)
sSecond second;
if (Validate()){
return TRUE;
}else{
ZeroDateTime();
return FALSE;
}
ParseDateTimeString_FALSE:
ZeroDateTime();
return FALSE;
}
BOOL
TDateTime::LoadCurrentDateTime()
{
time_t t;
time(&t);
FromUnixDatetime(t);
return TRUE;
}
void
TDateTime::FromUnixDatetime(time_t t)
{
t + TIMEZONE_8;
struct tm *tt gmtime( &t);
sYear tt->tm_year+1900;
sMonth tt->tm_mon+1;
sDay tt->tm_mday;
sHour tt->tm_hour;
sMinute tt->tm_min;
sSecond tt->tm_sec;
//free(tt);
}
void
TDateTime::ZeroDateTime(void)
{
sYear 0;
sMonth 0;
sDay 0;
sHour 0;
sMinute 0;
sSecond 0;
}
/// <summary>
/// 判定给定的年份是否是润年
/// </summary>
/// <param name"year">需要判定的年份</param>
/// <returns>true:给定的年份是润年。false:给定的年份不是润年。</returns>
责任编辑:小草