打印
[STM32F0]

STM32如何将UTC时间转换成unix时间戳

[复制链接]
6953|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cabbageybc|  楼主 | 2016-11-26 13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从GPS获取的时间为UTC时间的年,月,日,时,分,秒格式,希望转换成unix时间戳,C中time.h 提供函数mktime();将struct tm类型的结构体数据转换成unix时间戳,struct tm {
    int tm_sec;   /* seconds after the minute, 0 to 60
                     (0 - 60 allows for the occasional leap second) */
    int tm_min;   /* minutes after the hour, 0 to 59 */
    int tm_hour;  /* hours since midnight, 0 to 23 */
    int tm_mday;  /* day of the month, 1 to 31 */
    int tm_mon;   /* months since January, 0 to 11 */
    int tm_year;  /* years since 1900 */
    int tm_wday;  /* days since Sunday, 0 to 6 */
    int tm_yday;  /* days since January 1, 0 to 365 */
    int tm_isdst; /* Daylight Savings Time flag */
    union {       /* ABI-required extra fields, in a variety of types */
        struct {
            int __extra_1, __extra_2;
        };
        struct {
            long __extra_1_long, __extra_2_long;
        };
        struct {
            char *__extra_1_cptr, *__extra_2_cptr;
        };
        struct {
            void *__extra_1_vptr, *__extra_2_vptr;
        };
    };
};

疑问是 我只知道 结构体中的年月日,时分秒,而tm_wday,tm_yday,tm_isdst这三个参数是不知道的,请教应该如何处理才能把UTC时间转unix时间戳。
沙发
huangcunxiake| | 2016-11-26 23:06 | 只看该作者
使用date命令:


将当前系统时间转换为UNIX时间戳


$date +%s
1263236513
+%s是date的格式控制,上面命令的意思其实就是将当前系统时间以UNIX时间戳的形式输出。
如果要将任意UTC时间转换为UNIX时间戳的话:


?View Code BASH
1
2
$date -d '2010-01-12 utc' +%s
1263254400
相反的如果要将UNIX时间戳转换为UTC时间则是:




$date -d '1970-01-01 utc 1263236311 seconds'  +%Y-%m-%d-%H:%M:%S
2010-01-12-02:58:31
由此可以看出linux下的date命令还是十分强大的,更详细的介绍参看info date.


使用Python:


将当前系统时间转换为UNIX时间戳




>>> import time
>>> time.time()
1263239477.4449849
如果要将任意UTC时间转换为UNIX时间戳的话:




>>> import time
>>> time.time()
1263239477.4449849
>>> import datetime
>>> d1 = datetime.datetime(2010,1,12,2,28,01)
>>> t1 = time.mktime(d1.timetuple())
>>> print t1
1263234481.0
>>> d2 = time.localtime(t1)
mktime()函数是将time对象转为一个浮点数(即UNIX时间戳)。可以用localtime()再将浮点数转换
为time对象。
相反的如果要将UNIX时间戳转换为UTC时间则使用的是time.localtime()函数。


还有一个很有用的函数就是 time.strptime(string[,format]):
用来从一个字符串中按照一定的格式提取出一个struct_time,例如:


>>> import  time
>>> time.strptime("2010-1-12", "%Y-%m-%d")
time.struct_time(tm_year=2010, tm_mon=1, tm_mday=12, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=12, tm_isdst=-1)
其中的format转意符跟date命令中的相同,如下:


format转义符对应意义如下


%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%j 年内的一天(001-366)#hi.baidu.com/muinlive
%m 月份(01-12)
%M 分钟数(00=59)
%p 本地A.M.或P.M.的等价符
%S 秒(00-59)
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%Z 当前时区的名称
%% %号本身

使用特权

评论回复
板凳
huangcunxiake| | 2016-11-26 23:07 | 只看该作者
1.UTC时间 与 GMT时间

我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。

2.UTC时间 与 本地时

UTC + 时区差 = 本地时间

时区差东为正,西为负。在此,把东八区时区差记为 +0800,

UTC + (+0800) = 本地(北京)时间 (1)

那么,UTC = 本地时间(北京时间))- 0800 (2)

3.UTC 与 Unix时间戳
在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳。

4.怎样判断程序获取到的是UTC时间还是本地时间
让程序先获取一次时间戳,然后改变系统的时区设置,然后重新运行程序,在获取一次时间戳,比较两个时间戳的差如果很小(应该小于半小时,即180秒) ,则说明获取的是UTC时间,因为这个时间是与你的系统时区设置无关的。

使用特权

评论回复
地板
huangcunxiake| | 2016-11-26 23:10 | 只看该作者

unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)
是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.
一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。

使用特权

评论回复
5
cabbageybc|  楼主 | 2016-12-6 22:48 | 只看该作者
已经搞定,找了原子的一个例子里面 做日历的函数,其中有赚unix时间戳函数

使用特权

评论回复
6
houbin1234| | 2017-5-9 11:17 | 只看该作者
台湾友顺(utc)原厂ic mos 二三极管!有需要的联系!13717076781

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

148

帖子

1

粉丝