⼀个⽇期时间类,飞鸽传书可以完成:
1. 从⼀个给定的⽇期时间字符串中解析出⽇期时间信息
2. 提供⼀些常⽤的⽇期时间的校验算法
该类⽀持的⽇期时间格式如下:
5(五秒)
4:5(四分五秒)
5:3:6(五时三分六秒)(注:不是五⼩时,⽽是凌晨五时,绝对时间) 2-28(2⽉28⽇)
2-28 5:3:6(2⽉28⽇)
2008-2-28(2008年2⽉28⽇)
2008-2-28 17:3:6(2008年2⽉28⽇17时3分6秒)
还⽀持站位符⽅式:
-2- 仅设定⽉份为2⽉,其余⽇期采⽤当前值
2008-- 仅设定年
:23: 仅设定分
-- :: 全部省略,采⽤当前⽇期时间作为默认值
如果不能解析到指定的部分,则采⽤默认值(默认值为当前⽇期) 头⽂件:
/*
类名:TDateTime
描述:⽇期时间类
作⽤:1. 从⼀个给定的⽇期时间字符串中解析出⽇期时间信息
2. 提供⼀些常⽤的⽇期时间的校验算法
备注:
该类⽀持的⽇期时间格式如下:
5(五秒)
4:5(四分五秒)
5:3:6(五时三分六秒)(注:不是五⼩时,⽽是凌晨五时,绝对时间) 2-28(2⽉28⽇)
2-28 5:3:6(2⽉28⽇)
2008-2-28(2008年2⽉28⽇)
2008-2-28 17:3:6(2008年2⽉28⽇17时3分6秒)
还⽀持站位符⽅式:
-2- 仅设定⽉份为2⽉,其余⽇期采⽤当前值
2008-- 仅设定年
:23: 仅设定分
-- :: 全部省略,采⽤当前⽇期时间作为默认值
如果不能解析到指定的部分,则采⽤默认值(默认值为当前⽇期) 历史:
2008-11-21 尹曙光(kevdmx@sina)创建
*/
#ifndef _TDATETIME_H_20081121_
#define _TDATETIME_H_20081121_
//在windows下,如果强制使⽤32位的time_t,请定义以下宏:
//#ifndef _USE_32BIT_TIME_T
//#define _USE_32BIT_TIME_T
//#endif
#include
#ifndef BOOL
#define BOOL int
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
class TDateTime
{
public:
//年
unsigned short sYear;
//⽉
unsigned char sMonth;
//⽇
unsigned char sDay;
//时
unsigned char sHour;
//分
unsigned char sMinute;
//秒
unsigned char sSecond;
public:
//构造函数,采⽤当前的⽇期时间作为默认值
TDateTime();
//构造函数,从time_t类型的变量中取得⽇期时间
TDateTime(time_t t);
//从字符串中解析出⽇期时间,未解析到的部分,采⽤当前默认值 BOOL ParseDateTimeString(char *szDateTime);
//重新为当前的⽇期时间
BOOL LoadCurrentDateTime();
//转化为UNIX形式的time_t时间⽇期类型
time_t ToUnixDatetime();
//重新设定为有time_t类型变量指定的⽇期时间值
void FromUnixDatetime(time_t t);
//校验当前对象的⽇期时间数据是否正确
BOOL Validate();
//校验⼀个TDateTime类型变量的⽇期时间数据是否正确
static BOOL Validate(TDateTime *obDateTime);
//检查年份是否是闰年
static BOOL IsLeapYear(int year);
//校验给定的年份是否正确
static BOOL ValidateDate(int year);
//校验给定的年份和⽉分是否正确
static BOOL ValidateDate(int year,int month);
//取得给定的年份,给定的⽉份含有的天数
static int GetDaysOfMonth(int year, int month);
//校验给定的年⽉⽇数据是否正确
static BOOL ValidateDate(int year, int month, int day);
//检验给定的⼩时数据,是否正确
static BOOL ValidateTime(int hour);
//校验给定的⼩时分钟数据是否正确
static BOOL ValidateTime(int hour,int minute);
//校验给定的时间数据是否正确
static BOOL ValidateTime(int hour, int minute, int second);
//校验给定的⽇期时间数据是否正确
static BOOL ValidateDateTime(int year, int month, int day,
int hour, int minute, int second);
private:
//token类型定义
typedef enum TokenType
{
TT_Null 0,
TT_Number 1,
TT_Minus 2,
TT_Colon 4,
TT_Blank 8
};
//⽇期时间类型定义
typedef enum TimePart
{
TP_Second 1,
TP_Minute 2,
TP_Hour 4,
TP_Day 8,
TP_Month 16,
TP_Year 32
};
private:
//将当前对象变量清零
void ZeroDateTime(void);
//根据字符取得该字符所属的类型
TDateTime::TokenType GetTokenType(char c);
};
#endif //#ifndef _TDATETIME_H_20081121_
代码⽂件:
#include "stdafx.h"
#include
#include
#include "tdatetime.h"
//中国的时间区域为格林威治的东⼋区,故需要⼀个时间偏移量
const int TIMEZONE_8 8*60*60;
TDateTime::TDateTime()
{
LoadCurrentDateTime();
}
TDateTime::TDateTime(time_t t)
{
FromUnixDatetime(t);
}
TDateTime::TokenType
TDateTime::GetTokenType(char c)
{
if ((c>'0') && (c return TT_Number;
else if ('-'c){
return TT_Minus;
}else if ('/'c){
return TT_Minus;
}else if (' ' c){
return TT_Blank;
}else if(':'c){
return TT_Colon;
}else{
return TT_Null;
}
}
BOOL
TDateTime::ParseDateTimeString(char *szDateTime)
{
int len strlen(szDateTime) - 1;
TimePart timePart TP_Second;
int pw 1;//加权
signed short year-1;
signed char month-1,day-1,hour-1,minute-1,second-1; //过滤尾部空格 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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论