DSP学习-- UTC转UNIX时间戳
生活随笔
收集整理的這篇文章主要介紹了
DSP学习-- UTC转UNIX时间戳
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如需轉載請注明出處:https://juyou.blog.csdn.net/article/details/114646547
之前講過了,參看: STM32開發 – UTC、UNIX時間戳、北京時間之間的轉換
在Windows下稍微改了下。并且添加了,日期格式判斷。
save_time.h
#include "windows.h" #define xMINUTE (60 ) //1分的秒數 #define xHOUR (60*xMINUTE) //1小時的秒數 #define xDAY (24*xHOUR ) //1天的秒數 #define xYEAR (365*xDAY ) //1年的秒數unsigned int xDate2Seconds(SYSTEMTIME *time); void xSeconds2Date(unsigned long seconds, SYSTEMTIME *time ); int Judge_Date_Format(SYSTEMTIME time); uint32_t time_work_out(SYSTEMTIME start_time, SYSTEMTIME end_time);save_time.c
#include "save_time.h"//將localtime(UTC+8北京時間)轉為UNIX TIME,以1970年1月1日為起點 unsigned int xDate2Seconds(SYSTEMTIME *time) {static unsigned int month[12]={/*01月*/xDAY*(0),/*02月*/xDAY*(31),/*03月*/xDAY*(31+28),/*04月*/xDAY*(31+28+31),/*05月*/xDAY*(31+28+31+30),/*06月*/xDAY*(31+28+31+30+31),/*07月*/xDAY*(31+28+31+30+31+30),/*08月*/xDAY*(31+28+31+30+31+30+31),/*09月*/xDAY*(31+28+31+30+31+30+31+31),/*10月*/xDAY*(31+28+31+30+31+30+31+31+30),/*11月*/xDAY*(31+28+31+30+31+30+31+31+30+31),/*12月*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)};unsigned int seconds = 0;unsigned int year = 0;year = time->wYear-1970; //不考慮2100年千年蟲問題seconds = xYEAR*year + xDAY*((year+1)/4); //前幾年過去的秒數seconds += month[time->wMonth-1]; //加上今年本月過去的秒數if( (time->wMonth > 2) && (((year+2)%4)==0) )//2008年為閏年seconds += xDAY; //閏年加1天秒數seconds += xDAY*(time->wDay-1); //加上本天過去的秒數seconds += xHOUR*time->wHour; //加上本小時過去的秒數seconds += xMINUTE*time->wMinute; //加上本分鐘過去的秒數seconds += time->wSecond; //加上當前秒數<br> seconds -= 8 * xHOUR;seconds -= 8 * xHOUR;return seconds; }//UNIX轉為UTC 已進行時區轉換 北京時間UTC+8 void xSeconds2Date(unsigned long seconds, SYSTEMTIME *time ) {static unsigned int month[12]={/*01月*/31, /*02月*/28, /*03月*/31, /*04月*/30, /*05月*/31, /*06月*/30, /*07月*/31, /*08月*/31, /*09月*/30, /*10月*/31, /*11月*/30, /*12月*/31 };unsigned int days; unsigned short leap_y_count; time->wSecond = seconds % 60;//獲得秒 seconds /= 60; time->wMinute = seconds % 60;//獲得分 seconds += 8 * 60 ; //時區矯正 轉為UTC+8 bylzsseconds /= 60; time->wHour = seconds % 24;//獲得時 days = seconds / 24;//獲得總天數 leap_y_count = (days + 365) / 1461;//過去了多少個閏年(4年一閏) if( ((days + 366) % 1461) == 0) {//閏年的最后1天 time->wYear = 1970 + (days / 366);//獲得年 time->wMonth = 12; //調整月 time->wDay = 31; return; } days -= leap_y_count; time->wYear = 1970 + (days / 365); //獲得年 days %= 365; //今年的第幾天 days = 01 + days; //1日開始 if( (time->wYear % 4) == 0 ) { if(days > 60)--days; //閏年調整 else { if(days == 60) { time->wMonth = 2; time->wDay = 29; return; } } } for(time->wMonth = 0;month[time->wMonth] < days;time->wMonth++) { days -= month[time->wMonth]; } ++time->wMonth; //調整月 time->wDay = days; //獲得日 }//判斷日期格式是否正確,正確返回1,格式錯誤返回-1, int Judge_Date_Format(SYSTEMTIME time) {if ((time.wYear < 1980) || (time.wYear > 3000) || (time.wHour > 23) || (time.wMinute > 59) || (time.wSecond > 59)){return -1;}if ((time.wMonth > 12) || (time.wMonth < 1)){return -1;}else{if ((time.wYear % 4 == 0) && (time.wYear % 100 != 0) || (time.wYear % 400 == 0)){if (time.wMonth == 2){if ((time.wDay > 29) || (time.wDay < 1)){return -2;}else{return 1;}}}if ((time.wMonth == 4) || (time.wMonth == 6) || (time.wMonth == 9) || (time.wMonth == 11)){if ((time.wDay < 1) || (time.wDay > 30)){return -2;}else{return 1;}}else if (time.wMonth != 2){if ((time.wDay < 1) || (time.wDay > 31)){return -2;}else{return 1;}}else{if ((time.wDay < 1) || (time.wDay > 28)){return -2;}else{return 1;}}} }/*通訊時長*/ uint32_t time_work_out(SYSTEMTIME start_time, SYSTEMTIME end_time) {int32_t t_time = 0;t_time = xDate2Seconds(&end_time) - xDate2Seconds(&start_time);if (t_time < 0){t_time = 0;}return t_time; }如需轉載請注明出處:https://juyou.blog.csdn.net/article/details/114646547
總結
以上是生活随笔為你收集整理的DSP学习-- UTC转UNIX时间戳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派学习 -- 无法扫描出树莓派IP
- 下一篇: 嵌入式面试知识点总结 -- ARM篇