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