• UNIX Time 时间戳 与 北京时间 相互转换


    typedef struct t_xtime {
      int year; int month;  int day;   
      int hour; int minute;  int second; 
    } _xtime ;
    
    #define xMINUTE   (60             ) //1分的秒数
    #define xHOUR      (60*xMINUTE) //1小时的秒数
    #define xDAY        (24*xHOUR   ) //1天的秒数
    #define xYEAR       (365*xDAY   ) //1年的秒数
    

    可以通过在线转换工具,对程序结果进行验证:http://tool.chinaz.com/Tools/unixtime.aspx

    将localtime(UTC+8北京时间)转为UNIX TIME,以1970年1月1日为起点 

    unsigned int  xDate2Seconds(_xtime *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->year-1970;       //不考虑2100年千年虫问题
      seconds = xYEAR*year + xDAY*((year+1)/4);  //前几年过去的秒数
      seconds += month[time->month-1];      //加上今年本月过去的秒数
      if( (time->month > 2) && (((year+2)%4)==0) )//2008年为闰年
        seconds += xDAY;            //闰年加1天秒数
      seconds += xDAY*(time->day-1);         //加上本天过去的秒数
      seconds += xHOUR*time->hour;           //加上本小时过去的秒数
      seconds += xMINUTE*time->minute;       //加上本分钟过去的秒数
      seconds += time->second;               //加上当前秒数
     seconds -= 8 * xHOUR; return seconds; }

      

    将UNIX时间转为UTC+8 即北京时间

    //UNIX转为UTC 已进行时区转换 北京时间UTC+8
    void xSeconds2Date(unsigned long seconds,_xtime *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->second      = seconds % 60;//获得秒  
    	seconds          /= 60;  
    	time->minute      =  seconds % 60;//获得分  
    	seconds			 += 8 * 60 ;		//时区矫正 转为UTC+8 bylzs
    	seconds          /= 60;  
    	time->hour        = seconds % 24;//获得时  
    	days              = seconds / 24;//获得总天数  
    	leap_y_count = (days + 365) / 1461;//过去了多少个闰年(4年一闰)  
    	if( ((days + 366) % 1461) == 0)  
    	{//闰年的最后1天  
    		time->year = 1970 + (days / 366);//获得年  
    		time->month = 12;              //调整月  
    		time->day = 31;  
    		return;  
    	}  
    	days -= leap_y_count;  
    	time->year = 1970 + (days / 365);     //获得年  
    	days %= 365;                       //今年的第几天  
    	days = 01 + days;                  //1日开始  
    	if( (time->year % 4) == 0 )  
    	{  
    		if(days > 60)--days;            //闰年调整  
    		else  
    		{  
    			if(days == 60)  
    			{  
    				time->month = 2;  
    				time->day = 29;  
    				return;  
    			}  
    		}  
    	}  
    	for(time->month = 0;month[time->month] < days;time->month++)  
    	{  
    		days -= month[time->month];  
    	}  
    	++time->month;               //调整月  
    	time->day = days;           //获得日  
    }
    

      

  • 相关阅读:
    WeChat小程序开发(五、前端总结)
    前端实现复制到剪贴板
    vue的自定义指令含大写字母会失效
    如何把网页变成黑白
    原生JS offsetX和offsetY引起抖动
    jQuery中prop方法和attr方法区别
    Js for循环中的闭包 & let和var的混用对比
    html和body标签默认高度为0带来的影响
    JS字符串数组降维
    CSS浮动流脱标的字围现象
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3458805.html
Copyright © 2020-2023  润新知