如何排序日期(YYMMDD)并验证它?

时间:2013-12-21 23:37:11

标签: c++ validation

我正在创建一个需要YYMMDD格式日期的项目,所以我正在寻找一种可以用来验证它是“日期”的方法,我该如何对日期进行排序?任何帮助表示赞赏。

数据类型应为int。

6 个答案:

答案 0 :(得分:2)

http://www.boost.org/doc/libs/1_35_0/doc/html/date_time.html 应该做所有这些,然后一些 std::string ds("2002/1/25"); date d(from_string(ds));

答案 1 :(得分:1)

如果您收到的格式不能保证有效,请将输入YYMMDD存储为字符串。从字符串中抓取前两个字符(这应该是微不足道的,字符串是字符数组,数组具有直接访问权限)。确保这两个字符可以转换为00到99之间的整数。如果不是(例如,如果是字母或符号)则返回false。执行相同的月份,只能在01到12之间。使用流将字符转换为数字。这样做几天,应该强制执行31的上限和01的下限。

如果您想确认这样的日期实际上可以基于日历有效,则应该应用稍微修改的算法。 (例如,闰年将在2月份增加一天,而在非闰年则应该是非法的)。

最后,为了对它们进行排序,为应该创建的名为Date的类定义自定义比较器。然后将Date对象存储在集合(您的选择)中并应用排序算法,将其发送给自定义比较器。排序应该类似于基数排序,其中有效数字是年份。

如果其中任何一个听起来混淆了,请告诉我,我会填写详细信息。

答案 2 :(得分:1)

如果作为一个简单的整数传递,你可以使用std :: to_string,然后解析该字符串以检查每2个字符。

示例:

bool check_year(int year){
    ... check year for roll-over e.g. 99 to 00 ...
    ... if too low or high, false ...
}

bool check_day(int month, int day){
    ... check day based on month ...
    ... if too high, false ...
}

bool is_date_good(int date)
{
    std::string yolo = std::to_string(date);

    int check;

    check = stoi(yolo.substr(0, 2));
    if(!check_year(check))
        return false;

    check = stoi(yolo.substr(2, 2));
    if(check > max_month) // should be 12
        return false

    int month = check;
    check = stoi(yolo.substr(4, 2));

    if(!check_day(month, day))
        return false;

    return true;
}

答案 3 :(得分:1)

看起来其他人都在使用字符串。如果您的int格式为YYMMDD并且保证始终采用该格式,那么您实际上并不需要字符串。以下是我如何从中获取个别数字:

struct date { int year; int month; int day; };

date getDate(int yymmdd) {
    date d;
    d.day = yymmdd % 100;
    yymmdd /= 100;
    d.month = yymmdd % 100;
    yymmdd /= 100;
    d.year = yymmdd;
    return d;
}

现在,验证这是另一个问题。日期很复杂,你可能会错过一些东西,除非你有一个测试套件可以运行,所以肯定建议使用boost.date或类似的东西。否则,您必须检查当天是<= 28,29,30或31,具体取决于它是什么月份,以及该年是否为闰年(不仅仅是每4年)。但绝对建议只使用经过验证的库。

答案 4 :(得分:1)

由于您自1980年以来只有日期,因此对这些日期进行排序的便宜而肮脏的方式是将日期存储为SSMMDD格式的整数,其中SS是1980年以来的年份,而不是年份。然后他们'将按数字顺序排列,您可以在没有自定义比较器的情况下对它们进行排序。阅读日期时:

if (YY >= 80) {
    SS -= 80;
} else {
    SS += 20;
}

当然,您必须在输出之前将逆转换应用于日期。

答案 5 :(得分:1)

include      // std::cout
include     // std::sort
include        // std::vector

int getYear(int date) { int year = (date / 10000);

return (year < 20) ? 2000+year : year;

} int getMonth(int date) {

int month = (date / 100) % 100; return (date /100) % 100;

} int getDay(int date) { int d2 = (date /10) % 10; int d1 = (date /100) % 10;

return d2*10+d1;

} bool myfunction (int i,int j) {

if (getYear(i) > getYear(j)) return true; if (getYear(i) == getYear(j) && getMonth(i) > getMonth(j)) return true; if (getYear(i) == getYear(j) && getMonth(i) == getMonth(j) && getDay(i) > getDay(j)) return true; return false; }

int main () { int myints[] = {130525,951022 , 130624, 121212};

std::vector<int> myvector (myints, myints+4); std::sort (myvector.begin(), myvector.end(), myfunction); std::cout << "Year: " << getYear(130525); std::cout << "Month:" << getMonth(130525); std::cout << "Day:" << getDay(130525); std::cout << std::endl <<std::endl; std::cout << "Year: " << getYear(951022); std::cout << "Month:" << getMonth(951022); std::cout << "Day:" << getDay(951022); std::cout << std::endl; std::cout << "myvector contains:"; for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0; }

制作一个boo boo,这是正确更新的pastebin http://pastebin.com/yvBNrcTU