从纪元以来的几秒钟的星期几

vli*_*del 5 c time

我试图计算从纪元时间戳开始的秒数.从time.h我可以使用gmtime(),但这增加了1.3kB的程序,可能是因为gmtime()还计算日期.

所以,我想知道使用类似的东西会有什么问题:

(timestamp / (24*3600)) % 7
Run Code Online (Sandbox Code Playgroud)

我唯一能想到的是闰秒,这样像00:00:02这样的东西可能被归类为错误的一天.

编辑 这是针对嵌入式编程,1.3kB是64kB程序/固件的重要组成部分.此外,我不希望在此之后对时区或日期做任何事情.

chu*_*ica 2

使用类似以下内容会有什么问题:(?)

(timestamp / (24*3600)) % 7
Run Code Online (Sandbox Code Playgroud)

除了您没有指定纪元开始的星期几(例如星期四)或一周开始的星期几(例如星期一)之外,上述内容没有太大问题。有关一周第一天的更深入讨论,请参阅8601 。还要注意24*360016 位的计算int/unsigned会带来麻烦。

示例:假设纪元从一周中的第 3 日开始(星期一:0。星期四:3)。这可以同时处理两个问题:纪元的星期几和一周的第一天,因为只需要编码正差值。

#define EPOCH_DOW 3
#define SECS_PER_DAY 86400 
dow = ((timestamp / SECS_PER_DAY) + EPOCH_DOW) % 7;
Run Code Online (Sandbox Code Playgroud)

如果timestamp是有符号类型,请附加以下内容以确保结果在[0...6]范围内。

dow = (dow + 7) % 7;
// or 
if (dow < 0) dow += 7;  
Run Code Online (Sandbox Code Playgroud)

我怀疑您的应用程序中使用了闰秒。如果是的话,任务就会复杂得多,因为代码不仅需要处理更复杂的计算,还需要处理如何接收下一个计划的闰秒的更新——它们不规则地发生。