在C中使用Gettimeofday()的日、月、年算法
Day month and year algorithm using Gettimeofday() in C
我被要求设计一种计算当前月、日和年的方法。我将使用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,这会"浪费"时间,模拟到现在为止的时间流逝,然后运行那个循环,直到你用完时间。当你停下来的时候,你应该能够看到你是在哪一天停下来的;)
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- C++:尝试使用等效的 STL 算法消除原始循环
- 计算数组重复次数的组合的有效算法,加起来达到给定的总和
- 打印所有儿童树元素的最佳算法?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 我的排序算法程序中的堆错误
- 给定字符的排列算法,具有条件C++的重复
- Rcpp调用的c++计数算法模板
- 一个有效的图算法,满足以下条件
- 字母C++实现中的 Prim 算法
- 如果我使用minPts为1的DBSCAN算法,它还会在O(nlogn)时间内运行吗
- 如何在 c++ 中从 rosettacode 调用这个吴晓林的直线算法
- 使用简单的暴力算法找到数组中最大的4个元素
- 循环中的循环算法
- 从整数向量向量搜索整数向量的最佳算法
- 为什么此代码上的排序算法不调用类的交换版本?
- 是什么让这种易失性打破了结构的指针算法?
- 在C中使用Gettimeofday()的日、月、年算法