C++;将时间(NULL)转换为本地时间的函数 在C++中,我编写一个函数,它将时间(NULL)转换为自UTC时间以来的1970年1月1日的所有秒,以军事时间格式(小时:分钟:秒)的本地时间EST。老实说,我很困惑如何在数学上做到这一点,以便随着时间的推移,程序保持准确

C++;将时间(NULL)转换为本地时间的函数 在C++中,我编写一个函数,它将时间(NULL)转换为自UTC时间以来的1970年1月1日的所有秒,以军事时间格式(小时:分钟:秒)的本地时间EST。老实说,我很困惑如何在数学上做到这一点,以便随着时间的推移,程序保持准确,c++,function,time,C++,Function,Time,我也很清楚有一个本地时间函数,但我想从头开始构建这个函数。有人有什么建议或建议吗?有两件事你需要考虑: 1。闰年 一年中多出一天,这是可以用数学计算的 2。闰秒 根据需要插入或删除秒数(因此一分钟可以有61秒或59秒) 这些是不规则的,你需要一个查找表。否则,您的转换例程将不正确 例如,这里提供了它们的列表:localtime()如果将环境设置为正确的时区,则glibc应负责计算日期;否则请使用gmtime()。从值生成字符串是一项单独的工作,请参见strftime() 我也很清楚有一个本地时

我也很清楚有一个本地时间函数,但我想从头开始构建这个函数。有人有什么建议或建议吗?

有两件事你需要考虑:

1。闰年

一年中多出一天,这是可以用数学计算的

2。闰秒

根据需要插入或删除秒数(因此一分钟可以有61秒或59秒)

这些是不规则的,你需要一个查找表。否则,您的转换例程将不正确

例如,这里提供了它们的列表:

localtime()
如果将环境设置为正确的时区,则glibc应负责计算日期;否则请使用
gmtime()
。从值生成字符串是一项单独的工作,请参见
strftime()

我也很清楚有一个本地时间函数,但我想从头开始构建这个函数。有人有什么建议或提示吗

当有大量免费且经过良好测试的软件包时,为什么要这样做?正如评论中提到的,正确使用夏令时并非易事。基于IANA tzinfo数据库,现有软件包正是这样做的,而且它们做得很好

C选择:

  • std::localtime()
    。此函数使用全局变量;它不是线程安全的

  • localtime\u r()
    。这是一个POSIX函数,不是C++库的一部分。它在Windows上不存在

  • localtime\u s()
    。这是一个可选的C11函数。即使它存在于您的计算机上,它也可能不是
    的一部分

C++选项:

  • 提升日期时间

  • Howard Hinant的日期时间模块


如果您想了解将天数转换为年/月/日三倍(或更高)的算法,这里是经过高度优化的算法,详细解释了这些算法(操作重型机械时请勿阅读):

您还应该知道,
time()
的大多数(全部?)实现都跟踪一个UTC的近似值,称为。此计数仅将闰秒视为对不完美时钟的时钟校正。这意味着您可以在将秒转换为天时忽略闰秒的影响(只需除以86400)

对于转换为EST,您有一些选择(按照增加难度和准确性的顺序):

  • 您可以忽略夏令时,并始终将偏移量设置为-5小时

  • 您可以假设当前的夏令时规则,忽略一个事实,即它们在过去已经更改过很多次,并且很可能会再次更改

  • 你可以从, 或者您的操作系统的本地等效程序


  • 我的错。时间到了(空)。可能会有帮助。请注意,特别是当您以当地时间为目标时,在切换到夏令时和从夏令时切换到夏令时时,“随着时间的推移,程序保持准确”可能会变得复杂。日期/时间比最初看起来更复杂!我相信,在Unix中,时间闰秒不会影响时间流:单个时间点发生两次或被跳过。所以午夜+60*60*24秒总是午夜。只有当你需要知道两个时间点之间有多少秒时,你才需要闰表。他可以使用difftime函数。计算机时钟并不特别精确。这就是为什么我们有网络时间协议。闰秒发生后不久,连接到互联网的现代计算机将看到时间以某种方式发生了变化,并更新其系统范围内的“UTC 1970年1月1日00:00以来的秒数”计数器。底线:不需要考虑闰秒。Howard Hinnant的日期模块+1。查看并描述其用法。