我正在创建一个需要YYMMDD格式日期的项目,所以我正在寻找一种可以用来验证它是“日期”的方法,我该如何对日期进行排序?任何帮助表示赞赏。
数据类型应为int。
答案 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::vectorint 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