使用1990年1月1日作为纪元日期将天数转换为C中的日期

时间:2012-08-30 15:52:12

标签: c epoch

我有一个变量,表示自1990年1月1日以来的天数日期。有人知道我该怎么做吗?我正在使用MCS 8051,因此我无法使用任何脚本,标准库函数或内存分配(malloc或calloc)。这也不是一个功课。任何帮助将不胜感激。

2 个答案:

答案 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_wdaytm_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。

如果您需要从头开始使用日期算术,这将是一个很好的资源,如果只是因为日历充满了容易错过的特殊情况。