注册 登录
编程论坛 C++教室

讲一个日期根据给定的字符串输出相应的格式

鱼游海底 发布于 2015-11-07 23:14, 870 次点击
程序代码:
string Date::toString(string format_flag)  const {
    int length = format_flag.size();
    char *a = new char[81];
    if(length == 7) {sprintf(a, "%s/%s/%s", month, day, year);}
    if(length == 11) {sprintf(a, "%02s/%02s/%04s", month, day, year);}
    if(length == 13) {
        switch(month) {
        case 1 : sprintf(a, "January %02s,%04s", day, year); break;
        case 2 : sprintf(a, "Febrary %02s,%04s", day, year); break;
        case 3 : sprintf(a, "March %02s,%04s", day, year); break;
        case 4 : sprintf(a, "April %02s,%04s", day, year); break;
        case 5 : sprintf(a, "May %02s,%04s", day, year); break;
        case 6 : sprintf(a, "June %02s,%04s", day, year); break;
        case 7 : sprintf(a, "July %02s,%04s", day, year); break;
        case 8 : sprintf(a, "Augest %02s,%04s", day, year); break;
        case 9 : sprintf(a, "September %02s,%04s", day, year); break;
        case 10 : sprintf(a, "October %02s,%04s", day, year); break;
        case 11 : sprintf(a, "November %02s,%04s", day, year); break;
        case 12 : sprintf(a, "December %02s,%04s", day, year); break;
        }
    }
    return string(a);
}
19 回复
#2
鱼游海底2015-11-07 23:15
定义的Date类如下:
现在需要将其中的数字按照相应的格式转换为字符串输出
程序代码:
class Date {
private:
    int year, month, day;
private:
#3
鱼游海底2015-11-07 23:17
比如格式控制为   MM/dd/yyyy    则输出   11/07/2015
但是我的这一段代码输出    屯屯屯。。。。
#4
鱼游海底2015-11-07 23:18
望大神提示!!!
#5
TonyDeng2015-11-08 18:32
你這是C呢
#6
鱼游海底2015-11-08 19:32
回复 5楼 TonyDeng
你好!这是cpp
#7
TonyDeng2015-11-08 19:33
原來如此
#8
鱼游海底2015-11-08 19:35
回复 5楼 TonyDeng
这个代码有点长,但是出的问题的位置就是这个成员函数这里,所以我没有将整个代码贴过来,如果你需要我就贴过来!(就三个文件(.h,.cpp,.cpp),平均每个文件50行吧!)
#9
rjsp2015-11-09 08:58
以下是引用鱼游海底在2015-11-7 23:17:40的发言:

比如格式控制为   MM/dd/yyyy    则输出   11/07/2015
但是我的这一段代码输出    屯屯屯。。。。
format_flag 是 "MM/dd/yyyy" 的话,int length = format_flag.size(); 就等于10呀,但你的代码中根本就没有 if(length == 10)
#10
鱼游海底2015-11-09 20:42
回复 9楼 rjsp
只有本站会员才能查看附件,请 登录
#11
鱼游海底2015-11-09 20:42
回复 9楼 rjsp
这是程序显示的错误!
#12
rjsp2015-11-10 08:16
回复 11楼 鱼游海底
不好意思,能贴文字就贴文字,不能贴文字就贴图。
你放在rar中我不想打开,我也没有MS Word软件。再说看到你出错了有什么用呢,又不知道你代码是怎么写的。
#13
农民工2015-11-10 14:18
错误原因 9楼已经说得很清楚了
#14
鱼游海底2015-11-10 17:35
回复 12楼 rjsp
你好,代码有一点长!就是实现日期Date类的,如果你需要的话我就贴过来!从结果看,问题应该就出在这里。
#15
鱼游海底2015-11-10 17:36
回复 13楼 农民工
可是main函数中我没有使用这个格式控制啊!我将数字改后还是一样的错误!
#16
鱼游海底2015-11-10 17:43
程序代码:
main.cpp:::
#include <iostream>
#include <string>
#include "Date.h"
using namespace std;
int main() {
    Date d(2008, 8, 8);
    d.Print();
    cout << d.Date2Days() << endl;
    d = Date::Days2Date(d.Date2Days());
    d.Print();
    d = Date::Days2Date(2000);
    d.Print();
    cout << d.toString("MM/dd/yyyy") <<endl;
    cout << d.nthDay() << endl;
    cout << d.nthWeek() <<endl;
    d.NextDate().Print();
    d.PrevDate().Print();
    cout << d.DiffDate(Date::Today()) << endl;
    d.AfterNDays(100).Print();
    cout << d.Equal(Date::Today()) << endl;
    cout << d.Earlier(Date::Today()) << endl;
}
Date.h:::
#ifndef DATE_CLASS
#define DATE_CLASS
#include <iostream>
#include  <string>
using namespace std;
class Date {
private:
    int year, month, day;
private:
    enum {YearBase = 1970};
    enum {MonthBase = 1};
    enum {DayBase = 1};
    static int nDaysofMonth[13];
    void LeapYearEnabled() const;
public:
    Date(int y = YearBase, int m = MonthBase, int d = DayBase);
    Date(const Date& d);
    Date& operator = (const Date& rhs);
    void SetDate(int y, int m, int d);
    void Print() const;
    static bool IsLeapYear(int y);
    static int DaysOfThisYear(int y);
    int Date2Days() const;
    static Date Days2Date(int n);
    string toString(string format_flag)  const;
    static Date Today();
    int nthDay() const;
    int nthWeek() const;
    Date NextDate() const;
    Date PrevDate() const;
    int DiffDate(const Date& d) const;
    Date AfterNDays(int n) const;
    bool Equal(const Date& d) const;
    bool Earlier(const Date& d) const;
};
#endif
程序代码:
Date.cpp:::
#include <iostream>
#include <stdio.h>
#include <cassert>
#include <time.h>
#include "Date.h"
using namespace std;
int Date::nDaysofMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Date::Date(int y, int m, int d) {
    SetDate(y, m, d);
}
Date::Date(const Date& d) {
    if(this != &d) {
        year = d.year;
        month = d.month;
        day = d.day;
    }
}
Date& Date::operator = (const Date& rhs) {
    if(this != &rhs) {
        year = this->year;
        month = this->month;
        day = this->day;
    }
    return *this;
}
void Date::SetDate(int y, int m, int d) {
    year = y >= YearBase ? y : YearBase;
    month = m >= 1 && m <= 12 ? m : MonthBase;
    this->LeapYearEnabled();
    day = d >= 1 && d <= nDaysofMonth[month] ? d : DayBase;
}
void Date::LeapYearEnabled() const {
    if(IsLeapYear(year))
        nDaysofMonth[2] = 29;
    else
        nDaysofMonth[2] = 28;
}
void Date::Print() const {
    cout << this->year << "-" << this->month
        << "-" << this->day << endl;
}
bool Date::IsLeapYear(int y) {
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int Date::DaysOfThisYear(int y) {
    if(IsLeapYear(y)) return 366;
    else return 365;
}
int Date::Date2Days() const {
    this->LeapYearEnabled();
    int s = 0;
    s += day;
    for(int m = 1; m < month; ++m)
        s += nDaysofMonth[m];
    for(int y = YearBase; y < year; ++y)
        s += DaysOfThisYear(y);
    return s;
}
Date Date::Days2Date(int n) {
    Date d;
    int y = YearBase;
    while(n >= DaysOfThisYear(y)) {
        n -= DaysOfThisYear(y);
        ++y;
        if(n == DaysOfThisYear(y))
            break;
    }
    d.year = y;
    d.LeapYearEnabled();
    int m = 1;
    while(n >= nDaysofMonth[m]) {
        n -= nDaysofMonth[m];
        ++m;
        if(n == nDaysofMonth[m])
            break;
    }
    d.month = m;
    d.day = n;
    return d;
}
string Date::toString(string format_flag)  const {
    int length = format_flag.size();
    char *a = new char;
    if(length == 6) {sprintf(a, "%s/%s/%s", month, day, year);}
    if(length == 10) {sprintf(a, "%02s/%02s/%04s", month, day, year);}
    if(length == 12) {
        switch(month) {
        case 1 : sprintf(a, "January %02s,%04s", day, year); break;
        case 2 : sprintf(a, "Febrary %02s,%04s", day, year); break;
        case 3 : sprintf(a, "March %02s,%04s", day, year); break;
        case 4 : sprintf(a, "April %02s,%04s", day, year); break;
        case 5 : sprintf(a, "May %02s,%04s", day, year); break;
        case 6 : sprintf(a, "June %02s,%04s", day, year); break;
        case 7 : sprintf(a, "July %02s,%04s", day, year); break;
        case 8 : sprintf(a, "Augest %02s,%04s", day, year); break;
        case 9 : sprintf(a, "September %02s,%04s", day, year); break;
        case 10 : sprintf(a, "October %02s,%04s", day, year); break;
        case 11 : sprintf(a, "November %02s,%04s", day, year); break;
        case 12 : sprintf(a, "December %02s,%04s", day, year); break;
        }
    }
    return string((string)a);
}
Date Date::Today() {
    time_t timer;
    time(&timer);
    tm* t_tm = localtime(&timer);
    return Date(t_tm->tm_year, t_tm->tm_mon, t_tm->tm_mday);
}
int Date::nthDay() const {
    Date now;
    now = now.Today();
    LeapYearEnabled();
    int sum = 0;
    sum += day;
    for(int m = 1; m <= month; m++)
        sum += nDaysofMonth[m];
    return sum;
}
int Date::nthWeek() const {
    int sum(nthDay());
    return (sum / 7 + 1);
}
Date Date::NextDate() const {
    int sum(Date2Days() + 1);
    return Days2Date(sum);
}
Date Date::PrevDate() const {
    int sum(Date2Days() - 1);
    return Days2Date(sum);
}
int Date::DiffDate(const Date& d) const {
    int sum1(Date2Days());
    int sum2(d.Date2Days());
    return (sum1 - sum2) > 0 ? (sum1 - sum2) : (sum2 - sum1);
}
Date Date::AfterNDays(int n) const {
    int sum(Date2Days() + n);
    return Days2Date(sum);
}
bool Date::Equal(const Date& d) const {
    if(year == d.day && month == d.month && day == d.day) return true;
    else return false;
}
bool Date::Earlier(const Date& d) const {
    if(year < d.year || (year == d.year && month < d.month) ||
        (year == d.year && month == d.month && day < d.day)) return true;
    else return false;
}
#17
鱼游海底2015-11-10 19:18
其实是sprintf()里面格式控制写错了,不过获取系统当前时间也错了,谁可以帮我改一下那个实现(static Date today (){})。输出的不是当前日期,而是1970,10,10, ,这个不正确啊!!!#
#18
rjsp2015-11-11 08:28
错误太多,你自己慢慢找吧,比如

Date& Date::operator = (const Date& rhs) {
    if(this != &rhs) {
        year = this->year; // ---fuck 1:year = rhs.year
        month = this->month;
        day = this->day;

    }
    return *this;
}
///////////////////////////////////////////////////////////////////
char *a = new char; // ---fuck 2: char *a = new char[100];
///////////////////////////////////////////////////////////////////
sprintf(a, "%02s/%02s/%04s", month, day, year); // ---fuck 3: sprintf(a, "%02d/%02d/%04d", month, day, year);
///////////////////////////////////////////////////////////////////
return Date(t_tm->tm_year, t_tm->tm_mon, t_tm->tm_mday); // ---fuck 4: return Date(1900+t_tm->tm_year, 1+t_tm->tm_mon, t_tm->tm_mday);
#19
鱼游海底2015-11-11 11:13
回复 18楼 rjsp
多谢版主的细心指导!(不过第二个事实证明是可以这样写的,而且结果都出来了。)
#20
鱼游海底2015-11-11 12:25
回复 18楼 rjsp
程序代码:
Date Date::Today() {
    time_t timer;
    time(&timer);
    tm* t_tm = localtime(&timer);
    return Date(1900 + t_tm->tm_year, 1 + t_tm->tm_mon, t_tm->tm_mday);
//    return Date(Days2Date(timer/60/60/24));     //  ?? 看问号这里,为什么输出的是昨天呢,需要将Days2Date()里面的数加上1才是今天。但是我检查不出问题
}
1