个日期时间类飞鸽传书可以完成:
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下编译
最新评论