4

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

4

2 回答 2

2

我给你一个提示:

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

如果您需要使用不同的纪元或比例,则值会有所不同,但方法将保持不变。好吧,只要时间度量是线性的。


以下示例对于新信息不再正确,但我将其保留,以防任何能够使用标准库的人都能找到它。

为了使代码可移植,您首先要在 a 中组装纪元日期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);
}
于 2012-08-30T17:45:48.427 回答
1

There is a book that collects a huge amount of date and time calculation details and algorithms, that is almost certainly worth checking out. It is supported by source code in standard C (probably C89, certainly not newer).

Standard C Date/Time Library: Programming the World's Calendars and Clocks by Lance Latham, CMP, 1998, ISBN 978-0879304966.

If you needed to start from scratch with date arithmetic, this would be a great resource if only because calenders are full of special cases that are easy to miss.

于 2012-08-30T21:34:49.790 回答