- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为实验室的一部分,我需要设计一种计算当前月日和年份的方法。我将使用 gettimeofday() 函数,该函数提供自 1970 年 1 月 1 日以来的秒数。
我知道有些函数可以为我进行转换,但是设计要求是我创建自己的算法来将秒转换为月、日和年。我想要实现我的设计的方式是使用十二个月中的每个月和相应天数的查找表。现在我对这个逻辑有点困惑。
棘手的部分是处理闰年。我知道 1972 年是 1970 年以来的第一个闰年。自该日期起每 4 年发生一次闰年。这次作业给我的提示是,几天之后的下一个最大周期是 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 帐户 ~lol~
关于c++ - 在 C 中使用 Gettimeofday() 的日月年算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16020318/
#include #include int main() { float time; struct timeval tv; gettimeofday( &tv, NULL );
gettimeofday根据 this page 是 x86-86 的系统调用(只需在框中搜索 gettimeofday): int gettimeofday(struct timeval *tv,
我需要使用函数 gettimeofday 进行家庭作业,在阅读手册页并查看一些在线示例后,我不明白为什么人们有时同时使用结构的 tv_sec 成员和结构的 tv_usec 成员。 手册页指出: T
如果在我测量间隔时发生时间变化,会发生什么情况,例如: gettimeofday(&start, NULL); system("./anotherProgram"); // during the
是否有任何方法可以在不使用任何数组的情况下存储 gettimeofday() 中的时间刻度数并将其格式化为某种特定方式(例如“%m-%d-%Y %T”)? 这将为计算当前时间的程序的每个实例节省内存。
当我输出 gettimeofday() 的微秒字段时,我注意到微秒字段大于 1,000,000。有人知道为什么吗?这是否意味着我对 gettimeofday() 的解释是错误的? 郑重声明,我的假设是
我正在用 c 编写一些基本的东西,计算执行 shell 脚本所需的时间。 我有 gettimeofday(&start, NULL); // code here gettimeofday(&end,
我想获取一个线程进入临界区和另一个线程获得进入 ARM CortexA8 上同一临界区的权限之间耗时。为此,我一直在使用 C 语言中的 gettimeofday() 函数。 void *Thre
对于以下代码,我有时会得到负值。我不明白这一点。任何人都可以解释为什么会发生这种情况。 int64_t gettimelocal() { struct timeval Time; if
/* * Returns time in s.usec */ float mtime() { struct timeval stime; gettimeofday(&stime,0
我为我所在大学的抽样作业编写了这段代码。 #include #include #include #include int main(int argc, char **argv){ st
我正在尝试以十分之一秒的精度打印 ISO-8601 中的时间。YYYY-MM-DDThh:mm:ss.s 这是我的代码: #include #include #include #include
我有一个程序可以计算发布-订阅模型中对象的延迟时间。我为时间戳使用了以下函数: uint64_t GetTimeStamp() { struct timeval tv; gettime
我试过谷歌、php.net 和 php 邮件列表的存档,但我找不到我在找什么。也许这是显而易见的,或者也许没有人想知道这…… 多年来,我一直使用 microtime() 来获取当前时间,包括微秒。然而
如何将此功能从 linux 转换到 Windows?我不能使用 gettimeofday 函数 double getSysTime() { struct timeval tp; getti
我正在编写一个线程库,在安排线程时我需要知道它们已经准备了多长时间。每个 Thread 实例都有一个 timeval _timeInReady 字段,当我将一个实例推送到就绪队列时,我调用这个函数:
我正在将最初为 Win32 API 编写的游戏移植到 Linux(嗯,将 Win32 端口的 OS X 端口移植到 Linux)。 我已经实现了 QueryPerformanceCounter,方法是
我正在尝试计算系统调用的平均开销,因此我重复执行 0 字节读取系统调用,并将平均开销计算为时间差除以迭代次数。但是,有时当我这样做时,我会得到一个负数。这是我的代码: #include #inclu
我正在做一个涉及比较编程语言的项目。我正在计算阿克曼函数。我测试了 Java、Python 和 Ruby,得到了 10 到 30 毫秒之间的响应。但是 C++ 似乎需要 125 毫秒。这是正常的,还是
我正在尝试使用 gettimeofday 或 cudaEventRecord 来计时循环。然而,他们报告的结果截然不同。这是伪代码: // get time here (start) whil
我是一名优秀的程序员,十分优秀!