我有一个变量,表示自1990年1月1日以来的天数日期。有人知道我该怎么做吗?我正在使用MCS 8051,因此我无法使用任何脚本,标准库函数或内存分配(malloc或calloc)。这也不是一个功课。任何帮助将不胜感激。
答案 0 :(得分:1)
我会给你一个提示:
$ date --date 'jan 1 1990' +%s
631148400
这是'纪元日期' 1990年1月1日;自Unix时代以来以秒为单位表示。请注意,这仅适用于POSIX系统。
现在,您明确表示没有可用的标准库函数,您可能希望使用预先计算的纪元时间作为开头并向其添加days * 86400
。
可悲的是,我猜你不会有足够大的整数类型来处理算术。时间:
log(633826800, 2) = approx. 29.23951342
您至少需要32位类型来保存Unix纪元的价值。
例如,如果您有32位uint32_t
类型,则可以:
uint32_t days_to_epoch_date(int days)
{
uint32_t ret = 631148400L; /* value for Jan 1 1990 */
ret += 86400 * days;
return ret;
}
如果您需要使用不同的纪元或刻度,则值会有所不同,但方法将保持不变。好吧,只要时间测量是线性的。
以下示例不再适用于新信息,但我将其保留,以防有人能够使用标准库找到它。
要使代码易于移植,您首先要在struct tm
中汇总纪元日期:
#include <time.h>
time_t epoch_time_to_time_t(unsigned int days_since_epoch)
{
struct tm t = {0};
t.tm_mday = 1;
t.tm_mon = 0; /* Jan */
t.tm_year = 90; /* since 1900 */
t.tm_isdst = -1;
/* ... */
}
然后,在* 7.23.2.3 mktime
函数允许的情况下允许:
2 [...]结构的
tm_wday
和tm_yday
组件的原始值将被忽略,其他组件的原始值不限于上述范围。
...将天数添加到struct tm
,并使用mktime()
获取最终time_t
:
time_t epoch_time_to_time_t(unsigned int days_since_epoch)
{
/* ... */
t.tm_mday += days_since_epoch;
return mktime(&t);
}
答案 1 :(得分:1)
有一本书收集了大量的日期和时间计算细节和算法,这几乎肯定值得一试。标准C中的源代码支持它(可能是C89,当然不是更新)。
Standard C Date/Time Library: Programming the World's Calendars and Clocks,Lance Latham,CMP,1998,ISBN 978-0879304966。
如果您需要从头开始使用日期算术,这将是一个很好的资源,如果只是因为日历充满了容易错过的特殊情况。