我有一个字符串表示自纪元以来的秒数,我需要将它转换为人类可读的字符串。我在网上看到一些帖子建议简单地将一个整数转换为time_t
,如下所示:
time_t time = (time_t)(atoi(secs_since_epoch_str));
但是,如果我查找time_t的定义:
typedef /* unspecified */ time_t;
Although not defined by the C standard, this is almost always an integral
value holding the number of seconds (not counting leap seconds) since 00:00,
Jan 1 1970 UTC, corresponding to POSIX time.
所以,这并不能保证一定能成功。我想知道是否有一个合适的方法来做这件事?
2条答案
按热度按时间gpnt7bae1#
将 * 自epoch* 起的秒数转换为
time_t
我有一个表示 seconds since epoch 的字符串,我需要将它转换为人类可读的字符串。
将 seconds 偏移量添加到epoch
struct tm
的.tm_sec
成员,形成time_t
。1.将字符串转换为一个宽整数。(这里我假设字符串表示整数秒数。)它可能比
long
宽。为简洁起见,省略了错误处理。1.考虑
time_t
不一定是秒的计数(例如可能是纳秒),并且历元可能不是1970年1月1日的情况--这更有趣。1.添加到
struct tm
成员。可能将偏移量添加分段为多个部分以避免int
溢出。当int
为16位且offset
较大(例如88年以上)时,需要更多代码。1.调用
mktime()
将时间戳带入主范围并打印。请注意,由于time_t
可能是某种整数类型或浮点类型,因此转换为FP类型进行打印。0kjbasz62#
所以,这并不能保证一定能成功。我想知道是否有一个合适的方法来做这件事?
嗯......我不太明白你的意思。
time_t
是一个特定于unix的类型,它已经发展成为POSIX标准。如果你收到的是一个字符串,那么你必须处理它是一个64位数字的可能性(例如FreeBSD使用64位time_t
)关于纪元时间,它并不总是那个纪元(unix的第一个版本使用01.01.1972,但我想我们没有人见过这样的系统---我在家里运行一个用于pdp-11的unix v7,它有一个32位时间---当时没有
time_t
类型,它是一个long int
---它是基于实际的纪元时间)您必须小心,因为从概念开始,unix time就一直是一个 signed 值,因此它从1970-01-01开始,但是您可以指定日期早于,只要使用负值即可,如下所示:
这就是为什么它会在
另一方面,您的问题是不明确的,因为您没有说明最终的字符串数据必须转换到哪个地区和时区(或格式)。最好的方法是使用标准的unix时间函数(查找
gmtime(3)
、localtime(3)
和struct tm
关联类型)一种常见的做法是:
然后,如果您对时间的特定格式不感兴趣,请用途:
或者,您也可以对
struct tm
字段(tm_year
、tm_mon
、tm_mday
、tm_hour
、tm_min
、tm_sec
、tm_wday
、tm_yday
或tm_isdst
--最后一个字段用于了解您是在冬季还是夏季)进行操作所以一切都在POSIX中解决了。
最后,如果要将一个很大的数字(对于64位值)转换为time_t,最好的方法是使用以下公式进行转换:
(我使用了强制类型转换,因为
time_t
可以小于int64_t
,这样可以避免编译器发出警告)这将适用于64位和32位整数。一旦您将其转换为
time_t
,以上所有内容仍然有效。