C++ 在C中使用Gettimeofday()的日-月-年算法

C++ 在C中使用Gettimeofday()的日-月-年算法,c++,c,algorithm,epoch,C++,C,Algorithm,Epoch,作为实验室的一部分,我被要求设计一种计算当前月份、日期和年份的方法。我将使用gettimeofday()函数,该函数给出自1970年1月1日以来的秒数 我知道有些函数可以为我做相反的事情,但是设计要求是我创建自己的算法,将秒转换为月、日和年。我想要实现我的设计的方式是为十二个月中的每一个月和相应的天数提供一个查找表。这个逻辑现在让我有点困惑 棘手的部分是如何处理闰年。我知道1972年是自1970年以来的第一个闰年。从那一天起每四年就有一次闰年。这项作业给我的提示是,天之后的下一个最大周期是4年。

作为实验室的一部分,我被要求设计一种计算当前月份、日期和年份的方法。我将使用gettimeofday()函数,该函数给出自1970年1月1日以来的秒数

我知道有些函数可以为我做相反的事情,但是设计要求是我创建自己的算法,将秒转换为月、日和年。我想要实现我的设计的方式是为十二个月中的每一个月和相应的天数提供一个查找表。这个逻辑现在让我有点困惑

棘手的部分是如何处理闰年。我知道1972年是自1970年以来的第一个闰年。从那一天起每四年就有一次闰年。这项作业给我的提示是,天之后的下一个最大周期是4年。因此,如果我将1970年以来的天数乘以1461(4年内的天数),我知道我可以得到剩余天数。在这一点上,我的逻辑列车迷失了方向。如果我把它除以1461,它只会告诉我4年的周期已经过去了多少次

我想要实现的表看起来是这样的(我知道编码不完全正确,但只是为了显示我得到了什么):

我试图找出如何创建一个适当的索引使用天数或一些东西来遍历这个“表”……我希望在这里问这个问题是可以的。我在逻辑上挣扎了几天,现在

这是我现在遇到的这个问题的代码,它效率很低

    ExpandedTime* localTime(
                        struct timeval* tv,     // Pointer to timeval struct
                        ExpandedTime* etime     // '' '' to expandedtime strct
                        )
{
    tzset();                                    // Corrects for timezone

    int epochT = (tv->tv_sec) - timezone;       // Epoch seconds with
    int epochUT = tv->tv_usec;                  // epochtime microseconds
    int edays;                                  // Days since epochtime

    etime->et_usec = (epochUT/milli) % milli;   // Find the milliseconds

    etime->et_sec = epochT % 60;
    epochT /= 60;                               // Turn into minutes

    etime->et_min = epochT % 60;
    epochT /= 60;                               // Turn into hours

    if (localtime(&tv->tv_sec)->tm_isdst !=0)
        etime->et_hour = (epochT % 24) + daylight;      // Hours with DST correc
    else
        etime->et_hour = (epochT % 24);

    edays = epochT /= 24;                       // Turn into days

    etime->et_day = epochT;                     // Delete up to here
    etime->et_year = (epochT/365) + epochyear;  // Get the current year

    int trackyear;                              // Counter for years
    int trackdays = -1;                         // Subtracting janurary 1st
                                                // from days
   // This will determine if it is a leapyear and adjust days accordingly
    // from 1970 to current year (2013)

    for (trackyear = epochyear; trackyear < etime->et_year; trackyear++)
    {
        if (trackyear % leapy == 0)
        {
            trackdays = trackdays + 366;
        }
        else
        {
            trackdays = trackdays + 365;
        }
    }
    etime->et_day = edays - trackdays;

    int trackmonth = -1;                        // Counter for months
                                                // with offset to make
                                                // january = 0

    // This will give me the number of months for the buffer

    do
    {
        switch (trackmonth)
        {

            // Months with 31 days
            case 0:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 2:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 4:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 6:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 7:
            etime->et_day = (etime->et_day) - 31;
            break;
            case 9:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 11:
            etime->et_day = (etime->et_day) - 31;
            break;

            // Months with only 30 days

            case  3:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 5:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 8:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 10:
            etime->et_day = (etime->et_day) - 30;
            break;

            // Leap year month a.k.a Febuary

            case 1:
            if (trackyear % leapy)
            {
                etime->et_day = (etime->et_day) - 28;
            }
            else
            {
                etime->et_day = (etime->et_day) - 29;
            }

            break;

        }
        trackmonth++;

    }
    while(etime->et_day > 0);

    etime->et_mon = trackmonth - 1;
    // Reverts day offset from previous switch to
    // accurately represent the current day

    switch (etime->et_mon)
    {
            // Months with 31 days

            case 0:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 2:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 4:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 6:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 7:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 9:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 11:
            etime->et_day = (etime->et_day) + 31;
            break;

            // Months with only 30 days

            case  3:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 5:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 8:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 10:
            etime->et_day = (etime->et_day) + 30;
            break;

            // Leap year month a.k.a Febuary

            case 1:
            if (trackyear % leapy)
            {
                etime->et_day = (etime->et_day) + 28;
            }
            else
            {
                etime->et_day = (etime->et_day) + 29;
            }

            break;
    }

    return etime;

}
ExpandedTime*localTime(
struct timeval*tv,//指向timeval结构的指针
ExpandedTime*etime/''到ExpandedTime strct
)
{
tzset();//针对时区进行更正
int epochT=(电视->电视秒)-时区;//带有
int epochUT=tv->tv\u usec;//epochtime微秒
int-edays;//自epochtime起的天数
etime->et_usec=(epochUT/milli)%milli;//查找毫秒
时间->等秒=epochT%60;
epochT/=60;//变成分钟
时间->等待时间=epochT%60;
epochT/=60;//变成小时
如果(本地时间(&tv->tv_秒)->tm_isdst!=0)
etime->et_hour=(epochT%24)+日光;//使用DST correc的小时数
其他的
etime->et_hour=(epochT%24);
edays=epochT/=24;//变成天
etime->et_day=epochT;//删除到此处
etime->et_year=(epochT/365)+epochyear;//获取当前年份
int trackyear;//年计数器
int trackdays=-1;//减去1月1日
//从天起
//这将确定是否为闰年,并相应调整天数
//1970年至本年度(2013年)
对于(trackyear=epochyear;trackyearet_year;trackyear++)
{
如果(轨道年%leapy==0)
{
轨道天数=轨道天数+366;
}
其他的
{
trackdays=trackdays+365;
}
}
etime->et_day=edays-trackdays;
int trackmonth=-1;//月份计数器
//有偏移量
//一月=0
//这将给我缓冲的月数
做
{
道岔(轨道月)
{
//月加31天
案例0:
时间->等待日=(时间->等待日)-31;
打破
案例2:
时间->等待日=(时间->等待日)-31;
打破
案例4:
时间->等待日=(时间->等待日)-31;
打破
案例6:
时间->等待日=(时间->等待日)-31;
打破
案例7:
时间->等待日=(时间->等待日)-31;
打破
案例9:
时间->等待日=(时间->等待日)-31;
打破
案例11:
时间->等待日=(时间->等待日)-31;
打破
//只有30天的几个月
案例3:
时间->等待日=(时间->等待日)-30;
打破
案例5:
时间->等待日=(时间->等待日)-30;
打破
案例8:
时间->等待日=(时间->等待日)-30;
打破
案例10:
时间->等待日=(时间->等待日)-30;
打破
//闰年月份,又称二月
案例1:
如果(轨道年百分比跳跃)
{
时间->等待日=(时间->等待日)-28;
}
其他的
{
时间->等待日=(时间->等待日)-29;
}
打破
}
trackmonth++;
}
而(时间->等待日>0);
etime->et_mon=trackmonth-1;
//将日期偏移从上一次切换恢复为
//准确地表示当前日期
开关(定时->定时)
{
//月加31天
案例0:
时间->等待日=(时间->等待日)+31;
打破
案例2:
时间->等待日=(时间->等待日)+31;
打破
案例4:
时间->等待日=(时间->等待日)+31;
打破
案例6:
时间->等待日=(时间->等待日)+31;
打破
案例7:
时间->等待日=(时间->等待日)+31;
打破
案例9:
时间->等待日=(时间->等待日)+31;
打破
案例11:
时间->等待日=(时间->等待日)+31;
打破
//只有30天的几个月
    ExpandedTime* localTime(
                        struct timeval* tv,     // Pointer to timeval struct
                        ExpandedTime* etime     // '' '' to expandedtime strct
                        )
{
    tzset();                                    // Corrects for timezone

    int epochT = (tv->tv_sec) - timezone;       // Epoch seconds with
    int epochUT = tv->tv_usec;                  // epochtime microseconds
    int edays;                                  // Days since epochtime

    etime->et_usec = (epochUT/milli) % milli;   // Find the milliseconds

    etime->et_sec = epochT % 60;
    epochT /= 60;                               // Turn into minutes

    etime->et_min = epochT % 60;
    epochT /= 60;                               // Turn into hours

    if (localtime(&tv->tv_sec)->tm_isdst !=0)
        etime->et_hour = (epochT % 24) + daylight;      // Hours with DST correc
    else
        etime->et_hour = (epochT % 24);

    edays = epochT /= 24;                       // Turn into days

    etime->et_day = epochT;                     // Delete up to here
    etime->et_year = (epochT/365) + epochyear;  // Get the current year

    int trackyear;                              // Counter for years
    int trackdays = -1;                         // Subtracting janurary 1st
                                                // from days
   // This will determine if it is a leapyear and adjust days accordingly
    // from 1970 to current year (2013)

    for (trackyear = epochyear; trackyear < etime->et_year; trackyear++)
    {
        if (trackyear % leapy == 0)
        {
            trackdays = trackdays + 366;
        }
        else
        {
            trackdays = trackdays + 365;
        }
    }
    etime->et_day = edays - trackdays;

    int trackmonth = -1;                        // Counter for months
                                                // with offset to make
                                                // january = 0

    // This will give me the number of months for the buffer

    do
    {
        switch (trackmonth)
        {

            // Months with 31 days
            case 0:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 2:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 4:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 6:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 7:
            etime->et_day = (etime->et_day) - 31;
            break;
            case 9:
            etime->et_day = (etime->et_day) - 31;
            break;

            case 11:
            etime->et_day = (etime->et_day) - 31;
            break;

            // Months with only 30 days

            case  3:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 5:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 8:
            etime->et_day = (etime->et_day) - 30;
            break;

            case 10:
            etime->et_day = (etime->et_day) - 30;
            break;

            // Leap year month a.k.a Febuary

            case 1:
            if (trackyear % leapy)
            {
                etime->et_day = (etime->et_day) - 28;
            }
            else
            {
                etime->et_day = (etime->et_day) - 29;
            }

            break;

        }
        trackmonth++;

    }
    while(etime->et_day > 0);

    etime->et_mon = trackmonth - 1;
    // Reverts day offset from previous switch to
    // accurately represent the current day

    switch (etime->et_mon)
    {
            // Months with 31 days

            case 0:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 2:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 4:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 6:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 7:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 9:
            etime->et_day = (etime->et_day) + 31;
            break;

            case 11:
            etime->et_day = (etime->et_day) + 31;
            break;

            // Months with only 30 days

            case  3:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 5:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 8:
            etime->et_day = (etime->et_day) + 30;
            break;

            case 10:
            etime->et_day = (etime->et_day) + 30;
            break;

            // Leap year month a.k.a Febuary

            case 1:
            if (trackyear % leapy)
            {
                etime->et_day = (etime->et_day) + 28;
            }
            else
            {
                etime->et_day = (etime->et_day) + 29;
            }

            break;
    }

    return etime;

}
if(year % 4 == 0 && year % 100 == 0 && year % 25 != 0) 
    this is a leap year.