检查解析日期是否在日期范围内

时间:2010-04-01 02:47:33

标签: c++ scripting

所以我使用的是一种类似于c ++的脚本语言,我正在尝试考虑检查日期是否在范围内的最佳方法。我遇到的问题是,如果当天是新月,则检查失败。

以下是我的代码:

if(iMonth >= iStartMonth && iMonth <= iEndMonth)
{
    if(iDay >= iStartDay && iDay <= iEndDay)
    {
        if(iYear >= iStartYear && iYear <= iEndYear)
        {
                bEnabled = true;
                return;

当我有这样的事情时:

    Start date: 3 27 2010
    End Date: 4 15 2010
    Current Date: 3 31 2010

日期检查失败,因为if(iDay&lt; = iEndDay)未通过。脚本语言没有很多时间相关的功能,我无法比较时间戳,因为我允许用户将“03:27:2010”和“04:15:2010”作为开始/结束日期在配置文件中。我假设我只是没有直接思考并且错过了一个简单的修复。

5 个答案:

答案 0 :(得分:4)

您可以将所有日期转换为YYYY-MM-DD格式的字符串,然后进行字典比较。

答案 1 :(得分:3)

我找到的好方法是使用以下公式

(年* 10000)+(月* 100)+天

日期25/09/2013(日/月/年)变为20130925 为开始日期,结束日期和您想要比较和比较它们的日期做, 生成的代码将如下所示

bool isDateInRange(int day, int month, int year, int startDay, int startMonth, int startYear, int endDay, int endMonth, int endYear){
    int entryDate = (year * 10000) + (month * 100) + day;
    int startDate = (startYear * 10000) + (startMonth * 100) + startDay;
    int endDate = (endYear * 10000) + (endMonth * 100) + endDay;

    if (entryDate >= startDate && entryDate <= endDate){
        return true;
    }
    else{
        return false;
    }
}

答案 2 :(得分:1)

你应该真的使用boost::DateTime而不是试图重写轮子(当轮子是一个日期/时间框架时,它并不像它看起来那么微不足道)。这只适用于您粘贴的代码是C ++而不是您的脚本语言(不清楚)。我还可以建议使用Lua吗? :)


无论如何问题出在这里:

if(iDay >= iStartDay && iDay <= iEndDay)

如果iMonth == iStartMonth,您应该只检查这个,并且结束月份也是如此。否则iDay = 31iEndDay = 15和31 <= 15将失败。

此外,您应该先检查年份,然后是月份,然后是当天。

答案 3 :(得分:0)

如果你没有找到一个可以满足你需要的库,或者你喜欢自己做事,我就是Calendrical Calculations的忠实粉丝,它展示了如何将每一天表示为整数,以及如何在大量数量的约会系统中来回转换为月/日/年。整数表示使得调整和比较变得微不足道 - 您可以通过取模7的值来获得星期几!原作是一篇期刊文章,已经变成了一本书。

我已将Lua代码放在http://www.cs.tufts.edu/~nr/drop/lua/cal.lua

答案 4 :(得分:-2)

#include <iostream>
#include <ctime>

using namespace std;


bool isDateInRange(int day, int month, int year, int startDay, int startMonth, int startYear, int endDay, int endMonth, int endYear){
    int entryDate = (year * 10000) + (month * 100) + day;
    int startDate = (startYear * 10000) + (startMonth * 100) + startDay;
    int endDate = (endYear * 10000) + (endMonth * 100) + endDay;

    if (entryDate >= startDate && entryDate <= endDate){
        return true;
    }
    else{
        return false;
    }
}

void main()
{
    int day, month, year, startDay, startMonth, startYear, endDay, endMonth, endYear;

    // 11 June 2015
    // current date
    //day = 11; month = 6; year = 2015;
    time_t t = time(NULL);
    tm* timePtr = localtime(&t);

    day = timePtr->tm_mday;
    //cout << "day: " << day;
    month = timePtr->tm_mon + 1;
    //cout << "month: " << month;
    year = timePtr->tm_year + 1900;
    //cout << "year: " << year;

    // 1 Jan 2015
    startDay = 1; startMonth = 1; startYear = 2015;

    // 12 July 2015
    endDay = 12; endMonth = 5; endYear = 2015;

    bool isInRange = isDateInRange(day, month, year, startDay, startMonth, startYear, endDay, endMonth, endYear);

    if (isInRange)
    {
        cout << "In range " << endl;
    }
    else
    {
        cout << "Not in range " << endl;
    }