将秒数转换为时间

6
有没有一种方法可以将秒数(例如 3056144 秒,这是时间差而不是时间)转换为格式为 YYYY-mm-dd HH:MM:SS 的时间?
我尝试使用 localtime 将秒数转换为 struct tm,然后减去 UNIX 开始时间(1970-01-01),但效果不如预期。
提前致谢。
注:我必须使用 C++03,而不是 C++11。

解决方案需要多好?请记住,自1970年以来已经有几个闰秒,并且未来的闰秒通知不会提前很多。 - Bathsheba
1
你真的需要一个起始参考时间,否则格式YYYY-MM-...等就是无效的,因为当你说MM时,这是一个有28天、29天、30天或31天或31天带有额外一秒钟(闰秒12月)的月份?如果你有一个参考日期,你可以使用日历,否则你只能猜测(例如一个月==恰好30天,一年==恰好365天)。应用程序可能不关心,但那么为什么要使用这个特定的格式呢? - waTeim
如果这是一个时间差,你为什么还要尝试将其转换为绝对日期? - MSalters
2个回答

1

如果Boost.Date_Time对您是可行的选择,那么这可能是您正在寻找的内容:

#include <boost/date_time.hpp>

using boost::posix_time::seconds;
using boost::posix_time::to_simple_string;

std::cout << to_simple_string(seconds(3056144)) << std::endl;

这将打印:

848:55:44

然而,正如您在上面的输出中所看到的,它不会告诉您过去了多少年。这是有充分理由的,因为一年并不总是365天。


0
如果您要将时间差转换为类似于ISO 8601的时间格式,您只需要将时间差偏移与自1907-01-01以来对应于您的0(开始)时间的秒数相加,然后使用localtime将其转换为struct tm
由于每个月的天数取决于是哪个月和年份,试图将增量秒转换为大于天的任何时间单位,而不考虑实际日历上的起始时间和结束时间在哪里,这将充满错误。
就像 Bathsheba 提到的那样,这取决于您需要多精确。
我见过一些算法规避这个问题,只是假设一个月是30天(因此一年只有360天)。如果这是您想要做的事情,那么尝试使用 localtime 将会比它值得的麻烦更多。
如果您想要“完全”正确地执行此操作,则必须将起始时间和结束时间转换为实际对齐到纪元的 time_t 值,并使用某种具有日历感知的日期计算来计算两者之间的时间。 localtime 不够用(甚至没有考虑 timedelta 跨越 DST 边界时会差一个小时的情况)。

我不太理解你的意思。如果我设置了timedelta为61秒,那么应该返回0000-00-00 00:01:01等等。 - maverik
在调用localtime()之前,将你的开始时间(作为time_t)加上时间增量(整数秒数)。然后使用生成的struct tm或对其调用strftime() - mark4o
@mark4o:我没有任何“开始时间”。我有两个设备上的时间差,我需要将这个差转换成我提到的格式。 - maverik
@maverik:哦,我明白了。如果你没有绝对的time_t,那么你可以使用gmtime()代替localtime()。但这是一种奇怪的格式,因为每个月的天数都基于一年中的前几个月。或者,只需使用除法和模数来获得每月固定的30天或其他更合理的天数。 - mark4o
@maverick:61秒是一分钟,如果有闰秒的话。这真的是一个XY问题。你为什么要试图将时间差适应一个用于绝对时间/日期的格式呢? - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接