分享
 
 
 

一段实现日期显示的程序

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

序序我们都遇到过需要将整型时间按照一定格式显示的问题:如中文时间格式年-月-日 时:分:秒和英文时间格式MON/day Year hour:minute:second,或者是其它变化,如日期和时间不填0补齐和填0补齐等。

我们可以直接为每周时间输出格式准备一个输出函数,该输出函数基于format函数的格式来输出;但我们也需要一种通用的处理办法。

解决程序该程序基于标准函数实现,包含如下的头文件:

#include <time.h>

#include <iostream>

#include <strstream>

#include <string>

using namespace std;

转换函数封装到一个类中(当然可以不封装);我们定义了枚举变量Field来限定处理字段为6(年、月、日、时、分、秒)的最多处理能力。

算法的第1步是分解格式字符串的信息:把格式串每个关键字段的格式及其后缀字符记录下来,并把各字段出现的先后顺序记录到nOrder变量中。

算法的第2步是把整型时间转换为tm结构,然后依据各字段出现的先后顺序,按照其记录的个数和后缀,拼成一个字符串。

class DateGen

{

public:

//year, month, day, hour, minute, second

enum{FIELDS=6};

enum{YEAR, MONTH, DAY, HOUR, MINUTE, SECOND};

//Format string as following:

//YYYY-MM-DD hh:mm:ss

//among which character like 'Y' is key word,

//character like '-' is suffix.

//Count of key words varys from 1 to 4

bool getDate(time_t nTime, const string& strFormat, string& strOutput)

{

static char* pszMonthName[] = {

"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

bool bRet = true;

int nOrder[FIELDS];

int index = -1;

m_nCurrField = -1;

strOutput = "";

for(int i = 0; i < strFormat.length(); i ++)

{

switch(strFormat[i])

{

case 'Y':modArray(index, YEAR, nOrder); break;

case 'M':modArray(index, MONTH, nOrder); break;

case 'D':modArray(index, DAY, nOrder); break;

case 'h':modArray(index, HOUR, nOrder); break;

case 'm':modArray(index, MINUTE, nOrder);break;

case 's':modArray(index, SECOND, nOrder); break;

default:

{

if(index >= 0)

{

m_field[index].strSuffix += strFormat[i]; break;

}

else

{

bRet = false;

//ignore

}

break;

}

}

}

struct tm* pTime = localtime(&nTime);

for(i = 0; i < FIELDS; i ++)

{

char szBuf[8];

memset(szBuf, 0, sizeof(szBuf));

int nVal = -1;

switch(nOrder[i])

{

case YEAR:nVal = 1900 + pTime->tm_year; break;

case MONTH:nVal = pTime->tm_mon + 1; break;

case DAY:nVal = pTime->tm_mday; break;

case HOUR:nVal = pTime->tm_hour; break;

case MINUTE:nVal = pTime->tm_min; break;

case SECOND:nVal = pTime->tm_sec; break;

}

if(MONTH == nOrder[i] && m_field[MONTH].nCount == 3)

{

strOutput += pszMonthName[nVal - 1];

}

else

{

ostrstream os(szBuf, sizeof(szBuf) - 1);

os.width(m_field[nOrder[i]].nCount);

os.fill('0');

os << nVal;

strOutput += os.str();

}

if(m_field[nOrder[i]].strSuffix.length() > 0)

{

strOutput += m_field[i].strSuffix;

}

}

return bRet;

}

void reset()

{

m_nCurrField = -1;

for(int i = 0; i < FIELDS; i ++)

{

m_field[i].nCount = 0;

m_field[i].strSuffix = "";

}

}

private:

void modArray(int& index, const int nField, int nOrder[])

{

if(m_nCurrField != nField)

{

m_nCurrField = nField;

index ++;

nOrder[index] = nField;

}

m_field[m_nCurrField].nCount ++;

}

typedef struct Field

{

int nCount;

string strSuffix;

Field():nCount(0), strSuffix(""){};

} Field;

Field m_field[FIELDS];

int m_nCurrField;

};

如下是一段使用代码,只是举例一下:

int main(int argc, char* argv[])

{

DateGen gen;

string strFormat = "YYYY-MM-DD hh::mm::ss";

string strOutput;

if(gen.getDate(time(NULL), strFormat, strOutput))

{

cout << "format:" << strFormat << endl;

cout << strOutput << endl;

}

gen.reset();

strFormat = "YYYY-MMM-DD hh::mm::ss";

if(gen.getDate(time(NULL), strFormat, strOutput))

{

cout << "format:" << strFormat << endl;

cout << strOutput << endl;

}

gen.reset();

strFormat = "MM/DD/YYYY hh:mm:ss";

if(gen.getDate(time(NULL), strFormat, strOutput))

{

cout << "format:" << strFormat << endl;

cout << strOutput << endl;

}

return 0;

}

为了反复使用该类,特别加入了reset函数,把原来记录的信息复位。

这里只是提供了一种思路,在ascii环境下能够使用,并没有考虑unicode的情况。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有