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

Day month and year algorithm using Gettimeofday() in C

本文关键字:的日 算法 Gettimeofday      更新时间:2023-10-16

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

我知道有一些函数可以为我做转换,但是设计要求是我创建自己的算法来将秒转换为月、日和年。我想要实现我的设计的方式是使用12个月中的每个月和相应的天数的查找表。这个逻辑现在对我来说有点迷惑。

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

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

struct Monthdays
{
int days;
char* Monthname[]
};
Monthdays lookupMonths[]
{
{31,"January"}
{28,"February"}
.
.
.
};

我试图找出如何创建一个适当的索引使用天数或一些东西走过这个"表".........我希望在这里问这个问题没有问题。我一直在努力与逻辑或几天现在....

下面是我现在遇到的这个问题的代码,这个问题非常低效。

    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;
}

做一点网上冲浪的信息如何计算儒略历日期(或更准确地说儒略历日数)…这将解决你的问题或让你在你的道路上。

除此之外,帮别人做作业是不道德的…尽管……我有PayPal账户~哈哈~

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

这实际上是我大学里最难的一种作业…总而言之,根据需要的精确程度,我会告诉你(不要)查看时区以及不同时区何时进入夏令时…

很抱歉,如果答案不是很有帮助,但这是闰年的公式。如果你继续你的路线,你需要把中国定理带入这个…

但是如果您可以执行gettimeofday(),它将返回自1970年1月1日以来的毫秒数。所以你可以在里面放一点for,这会"浪费"时间,模拟到现在为止的时间流逝,然后运行那个循环,直到你用完时间。当你停下来的时候,你应该能够看到你是在哪一天停下来的;)