c++日期格式转换

绯色亚里亚 2013-12-04 01:21:38
帮忙看下下面代码的问题 课程设计
主要是功能2有问题
图片如下:



#include<iostream>
#include<time.h>
#include<string>
using namespace std;
class DateFormatter //日期格式
{
private:
int day;
int mon;
int year;
public:
DateFormatter();
DateFormatter(int day,int mon,int year);
DateFormatter(char *date);
inline int GetDay(){return day;} //返回日期
inline int GetMonth(){return mon;} //返回月份
inline int GetYear(){return year;} //返回年份
inline void SetDay(int d){day=d;} //设置日期
inline void SetMonth(int m){mon=m;} //设置月份
inline void SetYear(int y){year=y;} //设置年份
inline bool IsLeapYear() //查看是否是闰年
{
float rem=year%4;
if(rem==0.0)
{
return true;
}
else
{
return false;
}
}
void AddDays (int days); //在日期上加上天数
void IncrementMonth(); //在日期上加上月份
char*GetDate();
int FindDifferenceInMonths(DateFormatter); //返回两个日期间月份的差值
int FindDifferenceInDays (DateFormatter); //返回两个日期间天数的差值
static char* Today() //返回当前系统时间的字符串
{
const time_t curr=time(0);
tm *dt=localtime(&curr);
int d=dt->tm_mday;
int y=(dt->tm_year+1900);
int m=dt->tm_mon;
char mn[4];
strcpy(mn,FindMonth(m));
char ret[25];
strcpy(ret,FormatDate(d,mn,y));
return ret;
}
char*GetFormattedDate();
DateFormatter operator + (const int&); //在形参前面加上const
DateFormatter operator - (const int&); //在形参前面加上const
DateFormatter operator ++ (int);
DateFormatter operator -- (int);
int operator<(DateFormatter df);
int operator>(DateFormatter df);
int operator==(DateFormatter df);
int operator - (DateFormatter& df); //在形参前加上&运算符
private:
static char*FindMonth(int m) //根据月份返回表示月份的字符串
{
if(m==0)
{
return "JAN";
}
else if(m==1)
{
return "FEB";
}
else if(m==2)
{
return "MAR";
}
else if(m==3)
{
return "APR";
}
else if(m==4)
{
return "MAY";
}
else if(m==5)
{
return "JUN";
}
else if(m==6)
{
return "JUL";
}
else if(m==7)
{
return "AUG";
}
else if(m==8)
{
return "SEP";
}
else if(m==9)
{
return "OCT";
}
else if(m==10)
{
return "NOV";
}
else if(m==11)
{
return "DEC";
}
else
{
return "NUL";
}
}
int FindMonthInNumber(string m); //将用字符串表示的月份形式转换为数字形式
static char*FormatDate(int d,char *m,int y) //将时间用字符串形式表示
{
char* dy=new char[25];
char* yr=new char[25];
dy=itoa(d,dy,10);
yr=itoa(y,yr,10);
strcat(dy,"-");
strcat(dy,m);
strcat(dy,"-");
strcat(dy,yr);
return dy;
}
string to_lower(string s); //将字符串中所有字母转换为小写
int FindDaysInMonth(int m) //返回月份中的最大天数
{
if(m==0)
{
return 31;
}
else if(m==1)
{
if(IsLeapYear())
{
return 29;
}
else
{
return 28;
}
}
else if(m==2)
{
return 31;
}
else if(m==3)
{
return 30;
}
else if(m==4)
{
return 31;
}
else if(m==5)
{
return 30;
}
else if(m==6)
{
return 31;
}
else if(m==7)
{
return 31;
}
else if(m==8)
{
return 30;
}
else if(m==9)
{
return 31;
}
else if(m==10)
{
return 30;
}
else if(m==11)
{
return 31;
}
return -1;
}
};
DateFormatter::DateFormatter() //构造函数,将成员数据赋值为当前系统时间
{
const time_t curr=time(0);
tm *dt=localtime(&curr);
this->day=dt->tm_mday;
this->mon=dt->tm_mon;
this->year=(dt->tm_year+1900);
}
DateFormatter::DateFormatter(int day,int mon,int year) //构造函数,用指定时间设置成员函数
{
this->day=day;
this->mon=mon;
this->year=year;
}
DateFormatter::DateFormatter(char *date) /*构造函数,将用字符串表示的日期形式还原成整型,可以识别诸如1/1/03 1-12-2003等形式的字符串*/
{
if(strlen(date)>8)
{
string s1=date;
int p=s1.find_first_of('-'); //找到第一个‘-’,如12-2-2003
string day;
string month;
string year;
if(p==2)
{
day=s1.substr(0,2); //取出日期
month=s1.substr(3,3); //取出月份
year=s1.substr(7,4); //取出年份
}
else if(p==1)
{
day=s1.substr(0,1);
month=s1.substr(2,3);
year=s1.substr(6,4);
}
char cday[5];
strcpy(cday,day.c_str()); //日期转换为字符串
char cyear[5];
strcpy(cyear,year.c_str());
this->day=atoi(cday); //再将字符串转换为整型数字
this->mon=FindMonthInNumber(month);
this->year=atoi(cyear);
}
else if(strlen(date)==8||strlen(date)==7||strlen(date)==6)
{
int len=strlen(date);
string str=date;
string day;
string month;
string year;
int p1=str.find_first_of('-');
if(p1<=0) p1=str.find_first_of('/'); //如果格式中无‘-’,寻找‘/’
int p2=str.find_last_of('-');
if(p2<=0) p2=str.find_last_of('/');
if(len==8)
{
day=str.substr(0,2); //同样将年、月、日转换成整型数字
month=str.substr(3,2);
year=str.substr(6,2);
}
else if(len==7)
{
if(p1==1)
{
day=str.substr(0,1);
if(p2==3)
{
month=str.substr(2,1);
year=str.substr(4,2);
}
else
{
month=str.substr(2,2);
year=str.substr(5,2);
}
}
else
{
day=str.substr(0,2);
if(p2==3)
{
month=str.substr(2,1);
year=str.substr(4,2);
}
else
{
month=str.substr(3,2);
year=str.substr(5,2);
}
}
}
else if(len==6)
{
day=str.substr(0,1);
month=str.substr(2,1);
year=str.substr(4,2);
}
int m=atoi((month.c_str()));
m-=1;
int yr=atoi((year.c_str()));
char y[5];
if(yr>=0&&yr<=70) //再将年份前面补上世纪
{
strcpy(y,"20");
strcat(y,year.c_str());
}
else
{
strcpy(y,"19");
strcat(y,year.c_str());
}
this->day=atoi((day.c_str()));
this->mon=m;
this->year=atoi(y);
}
}
int DateFormatter::FindMonthInNumber(string m) //识别月份的英文形式,还原成整数
{
if(to_lower(m)=="jan")
{
return 0;
}
else if(to_lower(m)=="feb")
{
return 1;
}
else if(to_lower(m)=="mar")
{
return 2;
}
else if(to_lower(m)=="apr")
{
return 3;
}
else if(to_lower(m)=="may")
{
return 4;
}
else if(to_lower(m)=="jun")
{
return 5;
}
else if(to_lower(m)=="jul")
{
return 6;
}
else if(to_lower(m)=="aug")
{
return 7;
}
else if(to_lower(m)=="sep")
{
return 8;
}
else if(to_lower(m)=="oct")
{
return 9;
}
else if(to_lower(m)=="nov")
{
return 10;
}
else if(to_lower(m)=="dec")
{
return 11;
}
else
{
return -1;
}
}
string DateFormatter::to_lower(string s) //将字符串中的大写转换成小写
{
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
s[i]=tolower(s[i]);
}
}
return s;
}
char *DateFormatter::GetDate() //将以整型表示的日期转换为字符串的形式
{
char *d=new char[25];
char *m=new char[5];
char *y=new char[5];
d=itoa(day,d,10);
m=itoa((mon+1),m,10);
y=itoa(year,y,10);
strcat(d,"/");
strcat(d,m);
strcat(d,"/");
strcat(d,y);
char ret[25];
strcpy(ret,d);
delete[] d;
delete[] m;
delete[] y;
return ret;
}
char *DateFormatter::GetFormattedDate() //将用整数表示的时间改用字符串表示
{
char mn[5];
strcpy(mn,FindMonth(mon));
char ret[25];
strcpy(ret,FormatDate(day,mn,year));
return ret;
}
void DateFormatter::AddDays(int days) //日期加上天数成为一个新的日期,递归计算
{
if(day<=0) return;
int curr_day=this->day; //取对象当前日期
int curr_mon=this->mon; //取对象当前月份
int days_in_mon=FindDaysInMonth(curr_mon); //当前月份共有多少天数
if(this->mon==11&&days_in_mon==curr_day) //当月份为12月且当前日期为31天时
{
this->year++; //对象年份加1
}
if(days_in_mon==curr_day) //当前日期计满时
{
this->mon++; //当前月份加1
this->day=0; //日期清零
curr_day=0; //当前日期清零(可省略)
if(this->mon>11) //当前月份为12月,月份变为1月
{ this->mon=0; }
days_in_mon=FindDaysInMonth(this->mon); //新月份的天数
}
if(days<=days_in_mon) //相加的日期数小于新月份的天数
{
this->day+=days; //当前日期加上新天数
if(this->day>days_in_mon) //若大于当前月份应有的天数
{
this->mon++; //当前月份加1
if(this->mon>11) //当前月份为12月,月份变为1月
{ this->mon=0; }
this->day-=days_in_mon; //当前天数标准化
}
return;
}
else //当相加的天数大于当前月份的天数时
{
int days_to_add=days_in_mon-curr_day; //计算补满月份还需要的天数
this->day+=days_to_add; //补满当前月份的天数
if(this->day>days_in_mon) //天数多余当前月份
{
this->day=1; //为第一号
}
int rem_days=days-days_to_add; //求出剩余的天数
AddDays(rem_days); //递归计算
return;
}
}
DateFormatter DateFormatter::operator + (const int &days)
{
if(days <= 0) {cout<<"天数不为正,错误\n"; return *this;}
int curr_mon=this->mon;
int d=this->day+days; //把当前日期加上输入的天数赋给另一个变量保存起来
int days_in_mon = FindDaysInMonth(curr_mon);//当前月份共有多少天数
if(d>days_in_mon)
{
while(d/days_in_mon>=1)
{
d=d-days_in_mon;
if(d==0){d=days_in_mon;break;}
this->mon=this->mon+1;
days_in_mon = FindDaysInMonth(this->mon);
if(this->mon>11) {this->year=this->year+1;this->mon=this->mon%12;days_in_mon = FindDaysInMonth(this->mon);}
}
this->day=d;
}
else this->day=d;
if(this->mon>11)
{
this->year=this->year+this->mon/12;
this->mon=this->mon%12;
if(this->mon==0) this->mon=12;
}
return *this;
}
DateFormatter DateFormatter::operator - (const int &days)
{
if(days<=0){cout<<"天数不为正,错误\n";return *this;}
int curr_mon=this->mon;
int d=this->day-days;
int days_in_mon=FindDaysInMonth(curr_mon);
if(d<=0)
{


d=d+days_in_mon;
if(d==0)
{
this->mon=mon-1;
if(this->mon>11){
this->year=this->year-1;this->mon=this->mon%12;
}
d=days_in_mon;
}
else {



days_in_mon=FindDaysInMonth(this->mon);
if(this->mon>11){this->year=this->year-1;this->mon=this->mon%12;}
}
this->day=d;
}
else d=day-days;
this->day=d;
}
void DateFormatter::IncrementMonth() //月份加1
{
mon++;
if(mon>11)
{
mon=0;
year++;
}
}


...全文
477 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
buyong 2013-12-04
  • 打赏
  • 举报
回复
单步调试,
绯色亚里亚 2013-12-04
  • 打赏
  • 举报
回复
int DateFormatter::FindDifferenceInMonths(DateFormatter dft) //返回参数时间与对象时间相差的月份 { int diff=0; if(dft>*this) //参数时间大于对象时间 { return -1; } else if(dft==*this) //参数时间等于对象时间 { return 0; } else { while(1) { dft.IncrementMonth(); //参数时间加1 diff++; //差值加1 if((dft.GetYear()==this->year)&&(dft.GetMonth()==this->mon)) //当于对象时间相同,终止循环 { break; } } } if(this->GetDay()<dft.GetDay()) //参数时间小于对象时间 { diff--; } //差值减1 return diff; //返回差值 } int DateFormatter::FindDifferenceInDays(DateFormatter dft) //返回参数时间与对象时间相差的天数 { if(*this<dft) //参数时间大于对象时间 { return -1; } else if(*this==dft) //参数时间等于对象时间 { return 0; } else { int ret=0; while(1) { if(dft==*this) //参数时间等于对象时间 { break; } //终止循环 dft.AddDays(1); //参数时间加1 ret++; //差值加1 } return ret; } } int DateFormatter::operator - (DateFormatter &dft) { if(*this < dft) { cout<<"参数时间大于对象时间,无法相减\n"; return -1; } else if(*this == dft) {return 0;} else { int ret = 0; while(1) { if(dft == *this) {break;} dft+1; ret++; } return ret; } } DateFormatter DateFormatter::operator ++ (int) { return (*this+1);} DateFormatter DateFormatter::operator -- (int) { return (*this-1);} istream& operator>>(istream& in,DateFormatter& dft) { cout<<"请输入一个日期:"<<endl; char *tmp=new char; DateFormatter s; do { in>>tmp; DateFormatter t(tmp); if(t.GetMonth()!=-1&&t.GetDay()>0) {s=t; break; } cout<<"输入的日期有错误,请重新输入:\n"; } while(1); dft=s; return in; } ostream& operator<<(ostream &out,DateFormatter &dft) { char tmp[25]; strcpy(tmp,dft.GetDate()); out<<"得到的日期用第一种格式表示为:\n"<<tmp<<endl; strcpy(tmp,dft.GetFormattedDate()); out<<"得到的日期用第二种格式表示为:\n"<<tmp<<endl; return out; } int DateFormatter::operator<(DateFormatter df) //重载<运算符,对象时间大于参数时间返回1 { if(df.year>this->year) { return 1; } else if(df.year==this->year&&df.mon>this->mon) { return 1; } else if(df.mon==this->mon&&df.day>this->day) { return 1; } else { return 0; } } int DateFormatter::operator>(DateFormatter df) //重载>运算符,对象时间小于参数时间返回1 { if(df.year<this->year) { return 1; } else if(df.year==this->year&&df.mon<this->mon) { return 1; } else if(df.mon==this->mon&&df.day<this->day) { return 1; } else { return 0; } } int DateFormatter::operator==(DateFormatter df) //重载==运算符,对象时间等于参数时间返回1 { if((df.year==this->year)&&(df.mon==this->mon)&&(df.day==this->day)) { return 1; } else { return 0; } } int main() //测试上面的各成员函数 { cout<<" --------------测试成员函数---------------"<<endl; DateFormatter dft5("1-MAR-2012"); DateFormatter dft6("24/6/12"); char tmp[25]; strcpy(tmp,dft5.GetFormattedDate()); cout<<" .First date:"<<tmp<<endl; strcpy(tmp,dft6.GetFormattedDate()); cout<<" .Second date:"<<tmp<<endl; cout<<" .Diif in days:"<<dft6.FindDifferenceInDays(dft5)<<endl; cout<<" .Diff in months:"<<dft6.FindDifferenceInMonths(dft5)<<endl; dft6.AddDays(35); strcpy(tmp,dft6.GetFormattedDate()); cout<<" .Added 35 days to date 6:"<<tmp<<endl; dft5.IncrementMonth(); strcpy(tmp,dft5.GetDate()); cout<<" .Incremented first dates month:"<<tmp<<endl; cout<<" .Date5<Date6:"<<(dft5<dft6)<<endl; cout<<" .Date5==Date6:"<<(dft5==dft6)<<endl; cout<<" .Date5>Date6:"<<(dft5>dft6)<<endl; DateFormatter dft1,dft2,dft3; char tm[25]; strcpy(tm,dft1.Today()); cout<<"输出当前系统时间:"<<endl; cout<<'\t'<<"****************Today is:"<<tm<<"*******************"<<endl; cout<<'\t'<<"****************日期格式处理选单:*******************"<<endl; cout<<" 1.日期加天数"<<endl; cout<<" 2.日期减天数"<<endl; cout<<" 3.日期减日期"<<endl; cout<<" 4.日期减月份"<<endl; cout<<" 5.日期自加"<<endl; cout<<" 6.日期自减"<<endl; cout<<" 0.退出"<<endl; do { cout<<"请输入数字,选择相应的功能\n"; int n,m; cin>>n; switch(n) { case 0:exit(0); case 1: {cin>>dft1; cout<<"请输入增加的天数:\n"; cin>>m; dft2=dft1+m; cout<<dft2<<endl; break; } case 2:{cin>>dft1; cout<<"请输入减少的天数:\n"; cin>>m;dft2=dft1-m; cout<<dft2<<endl; break; } case 3:{ cin>>dft1>>dft2; int i3=dft2.FindDifferenceInDays(dft1); cout<<i3<<endl; break; } case 4:{cin>>dft1; cout<<"请输入减少的月份:"<<endl; char tmp[25]; dft1.IncrementMonth();strcpy(tmp,dft1.GetDate()); cout<<tmp<<endl; break; } case 5:{ cin>>dft1; dft1++; cout<<dft1; break; } case 6:{cin>>dft1; dft1--; cout<<dft1; break; } default:{ cout<<"出错了,请重试!"<<endl; } } } while(1); //while应放到这个位置。 system("pause"); return 0; }
学习并掌握C++2.0(11+14+17+20)的新特性,学习线程及线程池的应用 ---------------------------------------------------给小白学员的3年学习路径及计划技术方面分三块:1.纯开发技术方向2.音视频流媒体专业方向3.项目实战---------------------------------------------------1.纯开发技术方向(1) C++必须要过硬(至少学会10本经典好书)(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用(3) 框架与工具(Qt、MFC):必须精通其中一种。(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)(6) 最好学习点Java+Html+javascript等WEB技术。2.音视频流媒体专业方向(1) 音视频流媒体基础理论:   必须认真学会,否则看代码就是看天书(2) 编解码方向:精通h.264,h.265(hevc), 包括理论和各个开源库(ffmpeg,libx264,libx265,...)。(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...), 钻研各个开源库(live555,darwin,srs,zlmediakit,crtmpserver,...)(4) 视频监控:  理论+开源库(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...) 3.项目实战(1) Qt项目:  至少要亲手练习10个实战项目(网络服务器、多线程、数据库、图像处理、多人聊天、等等)(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,包括视频服务器、后台管理系统、前端播放器(多端)---------------------------------------------------  第1章 C++11新特性 41). nullptr关键字与新语法 42). auto和decltype类型推导 6 auto讲解 6 auto示例 7 decltype 83). for区间迭代 94). 初始化列表 105). 模板增强 11外部模板 11类型别名模板 12默认模板参数 126). 构造函数 13委托构造 13继承构造 147). Lambda 表达式 158). 新增容器 20std::array 20std::forward_list 21无序容器 22元组 std::tuple 239). 正则表达式 2610). 语言级线程支持 28多线程库简介 2811). 右值引用和move语义 31右值引用和move语义 32转移左值 3412). constexpr 35第2章 C++14新特性 36Lambda 函数 36类型推导 37返回值类型推导(Return type deduction) 37泛型lambda 39[[弃用的]]  [[deprecated]]属性 40二进制数字和数字分隔符 41第3章 C++17新特性 42安装GCC10.2 42安装msys2-x86_64-20200720 42更新镜像 42更新软件库 43安装 MinGW64 等必要的软件 43环境变量Path 43编译命令 43constexpr 44typename 45折叠表达式 47结构化绑定 48条件分支语句初始化 49聚合初始化 50嵌套命名空间 52lambda表达式捕获*this的值 53改写/继承构造函数 54用auto作为非类型模板参数 55__has_include 56fallthrough 57nodiscard 57maybe_unused 58第4章 C++20新特性 59编译命令 59concept 59typename 60explicit 61constinit 62位域变量的默认成员初始化 62指定初始化 63基于范围的for循环初始化 64放宽基于范围的for循环,新增自定义范围方法 65嵌套内联命名空间 66允许用圆括弧的值进行聚合初始化 67unicode字符串字面量 68允许转换成未知边界的数组 68likely和unlikely 69第5章 C++2.0(11/14/17/20)总结与分析 705.1 C语言与C++ 715.2 语言可用性的强化 725.2.1 常量 725.2.2 变量及其初始化 735.2.3 类型推导 745.2.4 控制流 765.2.5 模板 775.2.6 面向对象 815.3 语言运行期的强化 835.3.1 Lambda 表达式 835.3.2 右值引用 865.4 容器 885.4.1 线性容器 885.4.2 无序容器 895.4.3 元组 895.5 智能指针与内存管理 905.5.1 RAII 与引用计数 905.5.2 std::shared_ptr 905.5.3 std::unique_ptr 915.5.4 std::weak_ptr 91第6章 C++2.0多线程原理与实战 93什么是并发 93并发的方式 93为什么使用并发 95线程简介 96创建线程的三种方式 971. 通过函数 972.通过类对象创建线程 993.通过lambda表达式创建线程 101thread线程的使用 101互斥量与临界区 105期物Future 111条件变量 112原子操作 114内存模型 118第7章 C++2.0线程池原理与实战 120线程与线程池的基本原理 1201)、线程 1202)、线程的生命周期 1213)、什么是单线程和多线程 1214)、线程池 1225)、四种常见的线程池 123线程池的架构与流程 123线程池代码实战 125    

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧