Converting unix time into readable time
我从1970年1月1日起就有了Unix时间(例如1531074816),如何将其转换为可读格式?我只需要得到当前的小时、分钟和秒。我不担心日期和日期。我也在用C。谢谢。
- 如果不想转换到本地时区,请致电localtime或gmtime。然后直接从返回的struct tm *中打印字段,或者调用strftime为您打印字段。
- 找不到这样的dup,但请参阅c-faq.com/lib/curtime.html。
- 您需要担心得到的值是否包含闰秒,以及您使用的库是否处理闰秒。但除此之外(并非完全无关紧要),localtime()和gmtime()是答案。
- @jonathanlefler除非你知道我不知道的东西,否则我会非常自信地向任何一个普通的Unix/Linux应用程序程序员保证他们不需要担心这一点——实际上可以保证(a)他们所拥有的时间值不包含闰秒,(b)他们使用的库也不处理闰秒。(因此,他们只需要担心是否需要适当的跳跃秒处理,在这种情况下,他们可能会走运。)
- @史蒂文·萨米特:信息来自GPS接收器。我同意你的大多数其他消息来源。GPS可能不同。
- @约纳坦列弗勒啊,说得对。我也在想。我从来没有听说过GPS接收器或库输出time_t值。GPS接收机通常在向用户提供时间之前执行gps time->utc转换,但显然,time_t是一个糟糕的选择,因为它不能正确地表示真正的utc。
使用gmtime
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>
#include <time.h>
int main ()
{
static const time_t unixtimestamp = 1230728833;
struct tm *tmp = gmtime(&unixtimestamp );
printf("%02d:%02d:%02d
", tmp ->tm_hour , tmp ->tm_min , tmp ->tm_sec );
return 0;
} |
正如Steve Summit所说,最快和最简单的方法就是只使用localtime():
1 2 3 4 5 6 7 8
| void show_time (time_t time_from_gps )
{
struct tm *timmay ;
timmay = localtime(&time_from_gps );
printf("%02d:%02d:%02d
", timmay ->tm_hour , timmay ->tm_min , timmay ->tm_sec );
} |
号
你真的不想尝试改变你自己的时间程序。时间是复杂的,如果你让libc为你处理复杂的事情,生活就容易得多。
如果您不想使用任何第三方代码,可以执行以下操作:你应该首先在模运算符的帮助下摆脱自1970年以来的所有日子。那么,从今天开始,您就已经过了几秒钟。您可以使用这个数字计算通过的小时数。用同样的方法,你可以得到分钟和秒。
如果时间戳以秒为单位。然后:
1 2 3 4 5 6 7 8 9
| long currentTime;
long oneDay = 24L * 60 * 60;
long oneHour = 60 * 60;
long oneMinute = 60;
long currentDaySeconds = currentTime % oneDay;
long currentHour = currentDaySeconds / oneMinute;
long currentMinute = (currentDaySeconds % oneHour) / oneMinute;
long currentSeconds = currentDaySeconds % oneMinute; |
- 这对于牧场的工作来说可能已经足够好了,但是它并不准确,因为您不考虑闰秒。你将被从新纪元开始的跳跃秒数关闭——从这篇文章开始,差为37秒。
- @事实上,Jabberwock不是真的。posix说unix time_t值不能解释闰秒。这样的代码是可以保证工作的。
- @史蒂夫,你是绝对正确的——我不知道。谢谢。
- @SteveSummit编辑了,谢谢。
- 两个都错了…在UTC中插入闰秒是为了补偿地球自转(以UTC为基础)对tai(原子时间)的偏差。闰秒是可以估计的,并在应该插入时公布。他们修改了UTC的比例,但posix说(正确地)posix没有考虑到这一点。因此,必须手动更正unix内部时钟,以补偿闰秒插入。