字符串解析:日期时间字符串的解析类



个日期时间类飞鸽传书可以完成:
1. 从个给定日期时间串中解析出日期时间信息
2. 提供些常用日期时间校验算法

该类支持日期时间格式如下:
5( 5秒)
4:5( 4分 5秒)
5:3:6( 5时 3分 6秒)(注:不是 5小时而是凌晨 5时绝对时间)
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( 5秒)
4:5( 4分 5秒)
5:3:6( 5时 3分 6秒)(注:不是 5小时而是凌晨 5时绝对时间)
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 尹曙光([email protected]) 创建
*/

#ndef _TDATETIME_H_20081121_
# _TDATETIME_H_20081121_

//在windows下如果强制使用32位time_t请定义以下宏:
//#ndef _USE_32BIT_TIME_T
//# _USE_32BIT_TIME_T
//#end
# <time.h>

#ndef BOOL
# BOOL
#end

#ndef TRUE
# TRUE 1
#end

#ndef FALSE
# FALSE 0
#end

TDateTime
{
public:
//年
unsigned 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类型变量日期时间数据是否正确
BOOL Validate(TDateTime *obDateTime);
//检查年份是否是闰年
BOOL IsLeapYear( year);
//校验给定年份是否正确
BOOL ValidateDate( year);
//校验给定年份和月分是否正确
BOOL ValidateDate( year, month);
//取得给定年份给定月份含有天数
GetDaysOfMonth( year, month);
//校验给定年月日数据是否正确
BOOL ValidateDate( year, month, day);
//检验给定小时数据是否正确
BOOL ValidateTime( hour);
//校验给定小时分钟数据是否正确
BOOL ValidateTime( hour, minute);
//校验给定时间数据是否正确
BOOL ValidateTime( hour, minute, second);
//校验给定日期时间数据是否正确
BOOL ValidateDateTime( year, month, day,
hour, minute, 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);
};

#end //#ndef _TDATETIME_H_20081121_


代码文件:


# "stdafx.h"
# <stdlib.h>
# <.h>
# "tdatetime.h"

//中国时间区域为格林威治东 8区故需要个时间偏移量
const TIMEZONE_8 = 8*60*60;

TDateTime::TDateTime
{
LoadCurrentDateTime;
}

TDateTime::TDateTime(time_t t)
{
FromUnixDatetime(t);
}

TDateTime::TokenType
TDateTime::GetTokenType(char c)
{
((c>='0') && (c<='9'))
TT_Number;
('-'c){
TT_Minus;
} ('/'c){
TT_Minus;


/// <param name="month">给定月份</param>
/// <s>true:有效false:无效</s>
BOOL
TDateTime::ValidateDate( year, month)
{
(!ValidateDate(year))
FALSE;
(month > 0) && (month < 13);
}

/// <summary>
/// 得到个月份天数
/// </summary>
/// <param name="year">年</param>
/// <param name="month">月</param>
/// <s>返回该年该月总天数如果给定参数有则返回0</s>

TDateTime::GetDaysOfMonth( year, month)
{
(!ValidateDate(year, month))
{
0;
}

(month 4 || month 6 || month 9 || month 11)
{
30;
}
(month 1 || month 3 || month 5
|| month 7 || month 8 || month 10 || month 12)
{
31;
}
(2 month)
{
(IsLeapYear(year))//如果是闰年
{
29;
}

{
28;
}
}

0;
}

/// <summary>
/// 判定给定年月日是否是个有效日期
/// </summary>
/// <param name="year">给定年份</param>
/// <param name="month">给定月份</param>
/// <param name="day">给定日子</param>
/// <s>true:给定年月日是个有效日期false:不是个有效日期</s>
BOOL
TDateTime::ValidateDate( year, month, day)
{
(!ValidateDate(year, month))
FALSE;

((day < 1) || (day > GetDaysOfMonth(year, month)))
FALSE;

TRUE;
}

/// <summary>
/// 判定给定小事是否有效
/// </summary>
/// <param name="hour">给定小时</param>
/// <s>true:有效;false:无效</s>
BOOL
TDateTime::ValidateTime( hour)
{
(hour >= 0) && (hour < 24);
}

/// <summary>
/// 判定给定小时和分钟是否有效
/// </summary>
/// <param name="hour">给定小时</param>
/// <param name="minute">给定分钟</param>
/// <s>true:有效;false:无效</s>
BOOL
TDateTime::ValidateTime( hour, minute)
{
(!ValidateTime(hour))
FALSE;
(minute >= 0) && (minute < 60);
}

/// <summary>
/// 判定给定小时、分钟、秒时否有效
/// </summary>
/// <param name="hour">给定小时</param>
/// <param name="minute">给定分钟</param>
/// <param name="second">给定秒</param>
/// <s>true:有效;false:无效</s>
BOOL
TDateTime::ValidateTime( hour, minute, second)
{
(!ValidateTime(hour,minute))
FALSE;
(second >= 0) && (second < 60);
}

/// <summary>
/// 判定给定年月日时分秒是否是个有效日期时间
/// </summary>
/// <param name="year">给定年份</param>
/// <param name="month">给定月份</param>
/// <param name="day">给定日子</param>
/// <param name="hour">给定小时</param>
/// <param name="minute">给定分钟</param>
/// <param name="second">给定秒</param>
/// <s>true:有效;false:无效</s>
BOOL
TDateTime::ValidateDateTime( year, month, day,
hour, minute, second)
{
ValidateDate(year, month, day)
&& ValidateTime(hour, minute, second);
}

BOOL
TDateTime::Validate
{
Validate(this);
}

BOOL
TDateTime::Validate(TDateTime *obDateTime)
{
ValidateDateTime(obDateTime->sYear,obDateTime->sMonth, obDateTime->sDay,
obDateTime->sHour, obDateTime->sMinute, obDateTime->sSecond);
}

time_t
TDateTime::ToUnixDatetime
{
tm tt;
tt.tm_year = sYear - 1900;
tt.tm_mon = sMonth -1;
tt.tm_mday = sDay;
tt.tm_hour = sHour;
tt.tm_min = sMinute;
tt.tm_sec = sSecond;
mktime(&tt);
}

测试工程文件:

// parsedt.cpp : 定义控制台应用入口点
//

# "stdafx.h"
# "tdatetime.h"

//注意:在给定参数时日期和时间中间有空格分隔故需要有引号限定
//如:exe "2008-11-21 22:23:59"


//在UNIX下可以使用“\”进行转义
//如:exe 2008-11-21\ 22:23:59
( argc, char** argv)
{
TDateTime dtm;

(argc<2){
prf("parsedt datetime_");
1;
}

(!dtm.ParseDateTimeString(argv[1])){
prf("Error!\n");
1;
}

prf("year:%d, month:%d, day:%d, hour:%d, minute:%d, second:%d\n",
dtm.sYear, dtm.sMonth, dtm.sDay, dtm.sHour, dtm.sMinute, dtm.sSecond);

TDateTime dtm2(dtm.ToUnixDatetime);
prf("year:%d, month:%d, day:%d, hour:%d, minute:%d, second:%d\n",
dtm2.sYear, dtm2.sMonth, dtm2.sDay, dtm2.sHour, dtm2.sMinute, dtm2.sSecond);
0;
}



VS2005下编译通过该代码没有平台相关性可以在UNIX下编译
Tags:  解析xml字符串 dom解析字符串 java解析字符串 字符串解析

延伸阅读

最新评论

发表评论