⼀个⽇期时间类,飞鸽传书可以完成:
  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小时内删除。