unix时间戳_unix时间戳转换 - CSDN
精华内容
参与话题
  • UNIX时间戳

    千次阅读 2016-03-26 16:52:51
    时间戳是文件属性中的创建、修改、和访问时间。数字时间戳服务是Web网站安全服务项目之一,能提供电子文件的日期和...UNIX时间戳 在UNIX系统中,日期与时间表示为自1970年1月1日零点起到当前时刻的秒数,这种时间被称
    时间戳是文件属性中的创建、修改、和访问时间。数字时间戳服务是Web网站安全服务项目之一,能提供电子文件的日期和时间信息的安全保护。
    时间戳的优点是:
    可用变化的加密数值,防止数值被窃取后非法重复利用,起到加密的作用。时间戳主要依赖于时间,在约定的一段时间内产生唯一的一个数值。

    UNIX时间戳
    在UNIX系统中,日期与时间表示为自1970年1月1日零点起到当前时刻的秒数,这种时间被称为UNIX时间戳,以32位二进制数表示。在不同的操作系统中均支持这种时间表示方式,同一时间在UNIX和Windows中均以相同的UNIX时间戳表示,所以不需要在不同的系统中进行转换。
    目前UNIX时间戳是以32位二进制数表示,32位二进制数值范围为(-2147483648~+2147483647),由于系统不支持负的时间戳,因此,目前UNIX时间戳能表示的最大时间为2038年1月19日3点14分7秒,该时刻的时间戳为2147483647。于该时间后,需要扩展UNIX时间戳的二进制位数。

    PHP获取指定日期的时间戳
    PHP中应用mktime()函数将一个时间转换成为UNIX时间戳值。
    语法如下
    mktime(hour,minute,second,month,day,year,is_dst)
    参数 描述
    hour 可选。规定小时。
    minute 可选。规定分钟。
    second 可选。规定秒。
    month 可选。规定用数字表示的月。
    day 可选。规定天。
    year 可选。规定年。在某些系统上,合法值介于 1901 - 2038 之间。不过在 PHP 5 中已经不存在这个限制了。
    is_dst

    可选。如果时间在日光节约时间(DST)期间,则设置为1,否则设置为0,若未知,则设置为-1。

    自 5.1.0 起,is_dst 参数被废弃。因此应该使用新的时区处理特性。

    例如:

    echo "时间戳:".mktime().'<br>';//返回当前时间戳
    echo "任意日期:".date("Y-m-d",mktime(0,0,0,2,21,1996)).'<br>';
    echo "当前日期: ".date("Y-m-d",mktime()).'<br>';

    运行结果为:
    时间戳:1458979695
    任意日期:1996-02-21
    当前日期: 2016-03-26


    获取当前时间戳
    PHP通过time()函数获取当前的UNIX时间戳。
    语法如下:
    int time(void);
    该函数没有参数,返回值为UNIX时间戳的整数值。
    例如:
    echo time()."<br>";//输出当前时间戳
    $nextWeek = time()+(7*24*60*60);//一个星期七天,一天24小时,一个小时60分,一分60秒
    echo "Now: ".date("Y-m-d")."<br>";
    echo "Next Week: ".date("Y-m-d",$nextWeek);

    运行结果为
    1458980073
    Now: 2016-03-26
    Next Week: 2016-04-02 


    将英文文本的日期时间描述解析为UNIX时间戳
    strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳。

    语法

    strtotime(time,now)
    参数 描述
    time 规定要解析的时间字符串。
    now 用来计算返回值的时间戳。如果省略该参数,则使用当前时间。 
    例如:
    echo(strtotime("now")).'<br>';
    echo(strtotime("3 October 2005")).'<br>';
    echo(strtotime("+5 hours")).'<br>';
    echo(strtotime("+1 week")).'<br>';
    echo(strtotime("+1 week 3 days 7 hours 5 seconds")).'<br>';
    echo(strtotime("next Monday")).'<br>';
    echo(strtotime("last Sunday")).'<br>';

    运行结果为:
    1458980310
    1128268800
    1458998310
    1459585110
    1459869515
    1459094400
    1458403200

    如果想要查看这个时间戳对应的时间,例如:
    echo date("Y-m-d H:i:s",strtotime("now")).'<br>';
    echo date("Y-m-d H:i:s",strtotime("next Thursday")).'<br>';

    运行结果为:
    2016-03-26 16:21:32
    2016-03-31 00:00:00






    展开全文
  • C实现Unix时间戳和本地时间转化

    万次阅读 2017-01-18 13:44:52
    我们平常说时间都说的几点几分几秒,星期几,但是在计算机里面并不是直接使用我们所说的时间,而是使用Unix时间戳,这样不管是哪个平台,哪个系统,都可以根据自己对时间的定义进行转换,像Java,PHP等都提供了接口...

    我们平常说时间都说的几点几分几秒,星期几,但是在计算机里面并不是直接使用我们所说的时间,而是使用Unix时间戳,这样不管是哪个平台,哪个系统,都可以根据自己对时间的定义进行转换,像Java,PHP等都提供了接口来进行转化,C库里面也有这样的函数,那具体是怎么实现的呢?要了解这个问题首先我们就必须要清楚什么是Unix时间戳,什么是我们平常使用的时间。

    1. Unix时间戳

    UNIX时间戳: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。

    对应的时间和秒数如下

    时间
    1 分钟 60 秒
    1 小时 3600 秒
    1 天 86400 秒
    1 周 604800 秒
    1 月 (30.44 天) 2629743 秒
    1 年 (365.24 天) 31556926 秒

    2. 本地时间

    平常我们最常听见的是阴历和阳历之分,阴历是按照月亮的运行规律来计算日期的,那我们所说的阳历又是什么呢?其实阳历或者说叫西历最早是叫做儒略历,是由罗马共和国独裁官儒略·恺撒(即盖乌斯·尤里乌斯·凯撒)采纳数学家兼天文学家索西琴尼的计算后,于公元前45年1月1日起执行的取代旧罗马历法的一种历法,但令人遗憾的是,当时那些颁发历书的祭司们,却不了解改历的实质。结果,可笑的是,当时罗马执掌颁布历书的祭司竟把原来历法上规定的“每隔三年置闰”误解为“每三年置一闰”。从公元前45年起,到公元前9年为止,这之间本应设置10个闰年,他们却设置了13个闰年。公元前9年,人们终于发现这一差错,这时恺撒的外甥奥古斯都执掌政权,他纠正了这个错误,才停止了“三年一闰”。奥古斯都下令改正过来,改到次年(公元前8年)才置闰年。当改正这种闰年的错误时已经多闰了3年,为了去掉着多闰的3年,奥古斯都又下令停闰3年,即以公元前5年、公元前1年、公元前4年仍为平年,以后恢复了每4年一闰的规定了。奥古斯都为了宣扬这一功劳,仿效儒略·恺撒的做法,下令把自己出生的儒略历中的8月改称为奥古斯都月(这一名称在西方沿用到今天)。8月后的大,小月份都翻转过来了,9月为30天,10月为31天,11月为30天,12月为31天,这种置月方式一直沿用至今。如此一来,一年多出了一天,于是也从二月份29天里再减去一天,二月份只剩下28天了 1582年罗马教皇格里高利对”儒略历”又进行修改,规定被4整除的年为闰年,但逢百之年只有能被400除尽才能是闰年。这就是使用至今的“格里历”。这样做是为了使历年与回归年相接近。回归年的周期是365.2425天。儒略历一年的平均长度为365.25日,比回归年(365.2425天)长11分14秒,自公元325年(该年采用儒略历作为宗教日历)积累到十六世纪末,春分日由3月21日提早到3月11日。于是罗马教皇格里高利十三世(Gregorius XⅢ)于1582年10月4日还下令将次日(即原10月5日)定为10月15日,把春分日又恢复为3月21日。这样,1582年的10月5日-14日这十天就成了“不存在”的日子,变为历史的空白。1949年9月27日,经过中国人民政治协商会议第一届全体会议通过,中华人民共和国使用国际社会多数国家通用的西历和西元作为历法和纪年。

    3. 蔡勒公式

    清楚了Unix时间戳和公历的意义,怎么讲秒数转化成本地时间大家心里应该有个大概了,既然本地时间知道了,那我们可不可以根据这个日期直接知道那一天是星期几呢?数学家蔡勒(Zeller)推算出了这个公式,大家称为蔡勒公式,使用这个公式随便给出一个日期,就可以计算出是星期几。

    公式具体是这样的
    W = [C / 4] - 2C + y + [y / 4] + [13 * (M + 1) / 5] + d - 1
    或者是:w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1

    公式中的符号含义如下:
    w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
    c:世纪-1(前两位数)
    y:年(后两位数)
    m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
    d:日 [ ]代表取整,即只要整数部分。

    下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
    w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1
    = 49 + [49 / 4] + [20 / 4] - 2 × 20 + [26 × (10 + 1) / 10] + 1 - 1
    = 49 + [12.25] + 5 - 40 + [28.6]
    = 49 + 12 + 5 - 40 + 28
    = 54 (除以7余5)
    即2049年10月1日(100周年国庆)是星期五。

    再比如计算2006年4月4日,过程如下:
    w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1
    = 6 + [6 / 4] + [20 / 4] - 2 * 20 + [26 * (4 + 1) / 10] + 4 - 1
    = -12 (除以7余5,注意对负数的取模运算!实际上应该是星期二而不是星期五)

    不过要注意的是,蔡勒公式只适合于1582年(明朝万历十年)10月15日之后的情形。

    4. 具体实现

    清楚了上面这些内容,我们来看一下用C怎么实现Unix时间戳和本地时间的相互转化,并根据指定的时间算出对应的日期

    #include <stdio.h>
    #include <stdbool.h>
    
    #define UTC_BASE_YEAR 1970
    #define MONTH_PER_YEAR 12
    #define DAY_PER_YEAR 365
    #define SEC_PER_DAY 86400
    #define SEC_PER_HOUR 3600
    #define SEC_PER_MIN 60
    
    /* 每个月的天数 */
    const unsigned char g_day_per_mon[MONTH_PER_YEAR] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    /* 自定义的时间结构体 */
    typedef struct
    {
        unsigned short nYear;
        unsigned char nMonth;
        unsigned char nDay;
        unsigned char nHour;
        unsigned char nMin;
        unsigned char nSec;
        unsigned char DayIndex; /* 0 = Sunday */
    } mytime_struct;
    
    /*
     * 功能:
     *     判断是否是闰年
     * 参数:
     *     year:需要判断的年份数
     *
     * 返回值:
     *     闰年返回1,否则返回0
     */
    unsigned char applib_dt_is_leap_year(unsigned short year)
    {
        /*----------------------------------------------------------------*/
        /* Local Variables                                                */
        /*----------------------------------------------------------------*/
    
        /*----------------------------------------------------------------*/
        /* Code Body                                                      */
        /*----------------------------------------------------------------*/
        if ((year % 400) == 0) {
            return 1;
        } else if ((year % 100) == 0) {
            return 0;
        } else if ((year % 4) == 0) {
            return 1;
        } else {
            return 0;
        }
    }
    
    /*
     * 功能:
     *     得到每个月有多少天
     * 参数:
     *     month:需要得到天数的月份数
     *     year:该月所对应的年份数
     *
     * 返回值:
     *     该月有多少天
     *
     */
    unsigned char applib_dt_last_day_of_mon(unsigned char month, unsigned short year)
    {
        /*----------------------------------------------------------------*/
        /* Local Variables                                                */
        /*----------------------------------------------------------------*/
    
        /*----------------------------------------------------------------*/
        /* Code Body                                                      */
        /*----------------------------------------------------------------*/
        if ((month == 0) || (month > 12)) {
            return g_day_per_mon[1] + applib_dt_is_leap_year(year);
        }
    
        if (month != 2) {
            return g_day_per_mon[month - 1];
        } else {
            return g_day_per_mon[1] + applib_dt_is_leap_year(year);
        }
    }
    
    /*
     * 功能:
     *     根据给定的日期得到对应的星期
     * 参数:
     *     year:给定的年份
     *     month:给定的月份
     *     day:给定的天数
     *
     * 返回值:
     *     对应的星期数,0 - 星期天 ... 6 - 星期六
     */
    unsigned char applib_dt_dayindex(unsigned short year, unsigned char month, unsigned char day)
    {
        char century_code, year_code, month_code, day_code;
        int week = 0;
    
        century_code = year_code = month_code = day_code = 0;
    
        if (month == 1 || month == 2) {
            century_code = (year - 1) / 100;
            year_code = (year - 1) % 100;
            month_code = month + 12;
            day_code = day;
        } else {
            century_code = year / 100;
            year_code = year % 100;
            month_code = month;
            day_code = day;
        }
    
        /* 根据蔡勒公式计算星期 */
        week = year_code + year_code / 4 + century_code / 4 - 2 * century_code + 26 * ( month_code + 1 ) / 10 + day_code - 1;
        week = week > 0 ? (week % 7) : ((week % 7) + 7);
    
        return week;
    }
    
    /*
     * 功能:
     *     根据UTC时间戳得到对应的日期
     * 参数:
     *     utc_sec:给定的UTC时间戳
     *     result:计算出的结果
     *     daylightSaving:是否是夏令时
     *
     * 返回值:
     *     无
     */
    void utc_sec_2_mytime(unsigned int utc_sec, mytime_struct *result, bool daylightSaving)
    {
        /*----------------------------------------------------------------*/
        /* Local Variables                                                */
        /*----------------------------------------------------------------*/
        int sec, day;
        unsigned short y;
        unsigned char m;
        unsigned short d;
        unsigned char dst;
    
        /*----------------------------------------------------------------*/
        /* Code Body                                                      */
        /*----------------------------------------------------------------*/
    
        if (daylightSaving) {
            utc_sec += SEC_PER_HOUR;
        }
    
        /* hour, min, sec */
        /* hour */
        sec = utc_sec % SEC_PER_DAY;
        result->nHour = sec / SEC_PER_HOUR;
    
        /* min */
        sec %= SEC_PER_HOUR;
        result->nMin = sec / SEC_PER_MIN;
    
        /* sec */
        result->nSec = sec % SEC_PER_MIN;
    
        /* year, month, day */
        /* year */
        /* year */
        day = utc_sec / SEC_PER_DAY;
        for (y = UTC_BASE_YEAR; day > 0; y++) {
            d = (DAY_PER_YEAR + applib_dt_is_leap_year(y));
            if (day >= d)
            {
                day -= d;
            }
            else
            {
                break;
            }
        }
    
        result->nYear = y;
    
        for (m = 1; m < MONTH_PER_YEAR; m++) {
            d = applib_dt_last_day_of_mon(m, y);
            if (day >= d) {
                day -= d;
            } else {
                break;
            }
        }
    
        result->nMonth = m;
        result->nDay = (unsigned char) (day + 1);
        /* 根据给定的日期得到对应的星期 */
        result->DayIndex = applib_dt_dayindex(result->nYear, result->nMonth, result->nDay);
    }
    
    /*
     * 功能:
     *     根据时间计算出UTC时间戳
     * 参数:
     *     currTime:给定的时间
     *     daylightSaving:是否是夏令时
     *
     * 返回值:
     *     UTC时间戳
     */
    unsigned int mytime_2_utc_sec(mytime_struct *currTime, bool daylightSaving)
    {
        /*----------------------------------------------------------------*/
        /* Local Variables                                                */
        /*----------------------------------------------------------------*/
        unsigned short i;
        unsigned int no_of_days = 0;
        int utc_time;
        unsigned char dst;
    
        /*----------------------------------------------------------------*/
        /* Code Body                                                      */
        /*----------------------------------------------------------------*/
        if (currTime->nYear < UTC_BASE_YEAR) {
            return 0;
        }
    
        /* year */
        for (i = UTC_BASE_YEAR; i < currTime->nYear; i++) {
            no_of_days += (DAY_PER_YEAR + applib_dt_is_leap_year(i));
        }
    
        /* month */
        for (i = 1; i < currTime->nMonth; i++) {
            no_of_days += applib_dt_last_day_of_mon((unsigned char) i, currTime->nYear);
        }
    
        /* day */
        no_of_days += (currTime->nDay - 1);
    
        /* sec */
        utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int) (currTime->nHour * SEC_PER_HOUR +
                                                                    currTime->nMin * SEC_PER_MIN + currTime->nSec);
    
        if (dst && daylightSaving) {
            utc_time -= SEC_PER_HOUR;
        }
    
        return utc_time;
    }
    
    int main(int argc, char *argv[])
    {
        mytime_struct my_time;
        unsigned int sec;
        char *DayIndex[] = {"Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat."};
    
        /* 这里根据UTC时间戳计算出来的时间是零时区的时间,所以如果要转化成北京时间就需要多加8小时 */
        utc_sec_2_mytime(1484537668 + 8 * SEC_PER_HOUR, &my_time, false);
    
    
        printf("%d-%d-%d %d:%d:%d %s\n", my_time.nYear, my_time.nMonth, my_time.nDay,
                my_time.nHour, my_time.nMin, my_time.nSec, DayIndex[my_time.DayIndex]);
    
        sec = mytime_2_utc_sec(&my_time, false);
        printf("sec = %d\n", sec);
    
        return 0;
    }

    基本上的内容就这些了,平常最好能够直接使用系统提供的接口,如果不能使用的话就自己实现,根据上面的代码修改成自己需要的,如果有不对的地方,希望能够批评指正

    参考文献
    http://blog.csdn.net/areskris/article/details/8661983

    展开全文
  • Unix时间戳转化时间

    千次阅读 2019-02-18 11:07:13
    因为项目中经常用到Unix时间戳的转化,今天就总结一下 PHP中 这种方式在PHP程序中完成转换,优点是无论是不是数据库中查询获得的数据都能转换,转换范围不受限制,缺点是占用PHP解析器的解析时间,速度相对慢。 用...

    因为项目中经常用到Unix时间戳的转化,今天就总结一下

    PHP中
    这种方式在PHP程序中完成转换,优点是无论是不是数据库中查询获得的数据都能转换,转换范围不受限制,缺点是占用PHP解析器的解析时间,速度相对慢。
    用函数:
    date() 一般形式:date(‘Y-m-d H:i:s’, unix时间)
    PHP中将正常时间戳转化为Unix时间戳
    用函数:echo strtotime(“now”), “\n”;
    echo strtotime(“10 September 2000”), “\n”;
    echo strtotime("+1 day"), “\n”;
    echo strtotime("+1 week"), “\n”;
    echo strtotime("+1 week 2 days 4 hours 2 seconds"), “\n”;
    echo strtotime(“next Thursday”), “\n”;
    echo strtotime(“last Monday”), “\n”;

    MySQL中
    这种方式在MySQL查询语句中转换,优点是不占用PHP解析器的解析时间,速度快,缺点是只能用在数据库查询中,有局限性。

    1. UNIX时间戳转换为日期用函数: FROM_UNIXTIME()
      一般形式:select FROM_UNIXTIME(1156219870);
    2. 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP()
      一般形式:Select UNIX_TIMESTAMP(‘2006-11-04 12:23:00′);
      举例:mysql查询当天的记录数:
      $sql=”select * from message Where DATE_FORMAT(FROM_UNIXTIME(chattime),’%Y-%m-%d’) = DATE_FORMAT(NOW(),’%Y-%m-%d’) order by id desc”;

    JS中
    UNIX时间戳转换为日期用函数
    new Date(Unix时间戳*1000)
    在这里插入图片描述
    但是格式并不尽如人意,自定义format函数对其进行格式转化
    // 对Date的扩展,将 Date 转化为指定格式的String
    // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
    // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
    Date.prototype.Format = function(fmt)
    { //author: meizz
    var o = {
    “M+” : this.getMonth()+1, //月份
    “d+” : this.getDate(), //日
    “h+” : this.getHours(), //小时
    “m+” : this.getMinutes(), //分
    “s+” : this.getSeconds(), //秒
    “q+” : Math.floor((this.getMonth()+3)/3), //季度
    “S” : this.getMilliseconds() //毫秒
    };
    if(/(y+)/.test(fmt))
    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
    for(var k in o)
    if(new RegExp("("+ k +")").test(fmt))
    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : ((“00”+ o[k]).substr((""+ o[k]).length)));
    return fmt;
    }

    new Date(Unix时间戳*1000).Format(“yyyy-MM-dd hh:mm:ss”);
    在这里插入图片描述

    展开全文
  • 一、问题背景 最近项目中需要上传包含时间戳的设备数据到服务器平台。...Unix时间戳只占用4个字节,而且Unix时间戳在服务器端更加通用,但是在单片机上没有想Linux环境下现成的time(),localtime(),mkti...

    一、问题背景

    最近项目中需要上传包含时间戳的设备数据到服务器平台。原本想把“年”,“月”,“日”,“时”,“分”, “秒”分别用一个uint8_t的数据类型去存储,即占用6个字节。但是在平台配置协议时,只有一种叫“Unix时间戳”的数据类型。Unix时间戳只占用4个字节,而且Unix时间戳在服务器端更加通用,但是在单片机上没有想Linux环境下现成的time(),localtime(),mktime()等库函数调用。所以考虑自己实现Unix时间戳和北京时间的相互转换。

    二、Unix时间戳简介

    Unix时间戳:
    是从1970年1月1日00:00:00开始到当前时刻经过的秒数。
    例如:一个小时表示为Unix时间戳格式为:3600秒;一天表示为Unix时间戳为86400秒。 
    当然由于时区的关系,北京时间在算出来的秒数后面需要加上8个小时(8*3600秒)。

    比如在linux中,我们获取Unix时间戳可以用:

    typedef long time_t; /* time value */
    time_t time(time_t * timer)

    调用后会返回一个time_t类型的值(即long)。由于在大多数32位的设备上,long为4个字节有符号数,所以最大秒数为:2^23,大约2038年就会存在溢出的问题。所以后面的设备都用64位去存储,当然这不是本文探讨的地方。

    为什么使用Unix时间戳?
    在服务器端使用Unix时间戳更加通用。

    三、算法转换思路

    北京时间转Unix时间戳:

    这个转换比较简单,用当前的时间的年月日时分秒,依次减去1970/1/1 00:00:00即可。只要注意闰年的情况就行,最后注意需要加上北京时区的8个小时。

    Unix时间戳转北京时间:

    不严谨的说每隔4年就有一个闰年(此处暂不考虑2100年这样的非闰年,因为time_t限制,可取的范围只有1970~2038),所以可以将4年看做一个周期(即365+365+365+366=1461天)。通过总天数除以1461得到周期的个数,然后1970加上周期的个数乘以4就是年份。总天数对1461取余就是这个周期内的天数,然后根据平闰年去判断年月日时分秒。

    四、具体代码

    #include <stdio.h>
    #include <string.h>
    #include "stdint.h"
    
     
    #define FOURYEARDAY (365+365+365+366)  //4年一个周期内的总天数(1970~2038不存在2100这类年份,故暂不优化)
    #define TIMEZONE    (8)                //北京时区调整 
     
    typedef struct rtc_time_struct
    {
        uint16_t ui8Year;       // 1970~2038
        uint8_t ui8Month;       // 1~12
        uint8_t ui8DayOfMonth;  // 1~31
        uint8_t ui8Week;
        uint8_t ui8Hour;        // 0~23
        uint8_t ui8Minute;      // 0~59
        uint8_t ui8Second;      // 0~59
       
    }rtc_time_t;
     
    static uint8_t month_day[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年 
    static uint8_t Leap_month_day[12]={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年 
    const uint16_t dayPerYear[4] = {365, 365, 365, 366};
     
    // 判断是否是闰年 
    // year: 需要判断的年 
    // return:1:闰年
    //        0: 平年 
    uint8_t isLeapYear(uint16_t year)
    {
    	uint8_t res=0;
    	
    	if(year%4 == 0) // 能够被4整除 
    	{
    		if((year%100 == 0) && (year%400 != 0))	//能够被100整除,但是不能够被400整除 
    		{
    			res = 0;
    		}
    		else
    		{
    			res =1;
    		}
    	}
    	return res;
    }
     
    // 将Unix时间戳转换为北京时间
    // unixTime: 需要判断的Unix时间戳 
    // *tempBeijing:返回的北京时间
    // return:none
    // note:没对输入参数正确性做判断
    void covUnixTimeStp2Beijing(uint32_t unixTime, rtc_time_t *tempBeijing)
    {
        uint32_t totleDaynum=0, totleSecNum=0;
        uint16_t remainDayofYear, tempDay=0;
        uint8_t *pr, tempYear=0;
        
     
        totleDaynum = unixTime/(24*60*60); //总天数(注意加括号)
        totleSecNum = unixTime%(24*60*60); //当天剩余的秒速
     
        memset(tempBeijing, 0x00, sizeof(rtc_time_t));
        //1.计算哪一年
        tempBeijing->ui8Year = 1970 + (totleDaynum/FOURYEARDAY)*4;
        remainDayofYear = totleDaynum%FOURYEARDAY+1;
        while(remainDayofYear >= dayPerYear[tempYear]){
            remainDayofYear -= dayPerYear[tempYear];
            tempBeijing->ui8Year++;
            tempYear++;
        }
        
        //2.计算哪一月的哪一天
        pr = isLeapYear(tempBeijing->ui8Year)?Leap_month_day:month_day;
        while(remainDayofYear > *(pr+tempBeijing->ui8Month))
        {
    		remainDayofYear -= *(pr+tempBeijing->ui8Month);
            tempBeijing->ui8Month++;
        }
        tempBeijing->ui8Month++; //month
        tempBeijing->ui8DayOfMonth = remainDayofYear; //day
      
        //3.计算当天时间
        tempBeijing->ui8Hour = totleSecNum/3600;
        tempBeijing->ui8Minute = (totleSecNum%3600)/60; //error:变量搞错
        tempBeijing->ui8Second = (totleSecNum%3600)%60;
     
        //4.时区调整
        tempBeijing->ui8Hour +=TIMEZONE; 
        if(tempBeijing->ui8Hour>23){
            tempBeijing->ui8Hour -= 24;
            tempBeijing->ui8DayOfMonth++;
        }
    }
     
    // 将北京时间转换为Unix时间戳 
    // year: 需要判断的年 
    // return:Unix时间戳(从1970/1/1 00:00:00 到现在的秒数) 
    // note:没对输入参数正确性做判断
    uint32_t covBeijing2UnixTimeStp(rtc_time_t *beijingTime)
    {
    	uint32_t daynum=0, SecNum=0; //保存北京时间到起始时间的天数
    	uint16_t tempYear=1970, tempMonth=0;
     
     
    	//1.年的天数 
    	while(tempYear < beijingTime->ui8Year) 
    	{
    		if(isLeapYear(tempYear)){
    			daynum += 366;
    		}
    		else{
    			daynum += 365;
    		}
    		tempYear++;
    	}
    	//2.月的天数
     	while(tempMonth < beijingTime->ui8Month-1) 
     	{
            if(isLeapYear(beijingTime->ui8Year)){ //闰年
                daynum += Leap_month_day[tempMonth];
            }
            else{
    		    daynum += month_day[tempMonth];
            }
    		tempMonth++;
    	}
        //3.天数
    	daynum += (beijingTime->ui8DayOfMonth-1);
     
        //4.时分秒
        SecNum = daynum*24*60*60; //s    
        SecNum += beijingTime->ui8Hour*60*60;    
        SecNum += beijingTime->ui8Minute*60;    
        SecNum += beijingTime->ui8Second;
     
        //5.时区调整
        SecNum -= TIMEZONE*60*60;
     
        return SecNum;
    }
     
     
    //测试主函数 
    int main()
    {
        rtc_time_t testTime;
        uint32_t UnixTimsStamp=0;
     
        // 测试用例:平/闰年,闰月,8点前等 
        // 使用时,修改这里就可以
        testTime.ui8Year = 2016;
        testTime.ui8Month = 02;
        testTime.ui8DayOfMonth = 29;
        testTime.ui8Hour = 05;
        testTime.ui8Minute = 20;
        testTime.ui8Second = 00;
      
        UnixTimsStamp = covBeijing2UnixTimeStp(&testTime);
        printf("%d/%02d/%02d-%02d:%02d:%02d convert is: %u\n\n", \
                        testTime.ui8Year, testTime.ui8Month, testTime.ui8DayOfMonth, \
                        testTime.ui8Hour, testTime.ui8Minute, testTime.ui8Second, UnixTimsStamp);
     
        covUnixTimeStp2Beijing(UnixTimsStamp, &testTime);
        printf("%u convert is: %d/%02d/%02d-%02d:%02d:%02d\n", UnixTimsStamp, 
                        testTime.ui8Year, testTime.ui8Month, testTime.ui8DayOfMonth, \
                        testTime.ui8Hour, testTime.ui8Minute, testTime.ui8Second);
    }
     

    运行结果如下:

    五、结果验证

    通过站长工具验证,测试ok:

     
    展开全文
  • unix时间戳

    2018-12-25 14:36:21
    unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。  UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.  一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为...
  • Unix时间戳

    千次阅读 2018-04-05 18:02:27
    Unix时间戳Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp),是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒[1]。为什么从1970年1月1日开始?最懒的解释:UNIX系统认为...
  • unix时间戳和毫秒时间戳

    千次阅读 2016-07-05 16:48:53
    unix时间戳:单位是秒 毫秒时间戳:单位是毫秒 毫秒时间戳 =
  • Unix时间戳一天是多少?

    千次阅读 2019-10-12 17:18:18
    Unix时间戳一天是多少? 一天的时间戳是 86400
  • UNIX时间戳函数

    2019-04-22 19:03:33
    UNIX_TIMESTAMP(date)若无参数调用,则返回一个Unix时间戳(‘1970-01-01 00:00:00’)作为无符号整数。 例1:使用UNIX_TIMESTAMP函数返回UNIX格式的时间戳,输入语句如下: mysql> select unix_timestamp(),unix...
  • Unix时间戳(Unix timestamp)在线转换工具

    千次阅读 2018-11-01 16:39:16
    我们在编程过程中不可避免会遇到unix时间戳跟时间相互转换的操作,如下图,编程爱好者之家给大家带来了最便捷的在线转换如下图,具体转换请点击链接 https://www.codelovers.cn/tools/unix.html 即可实现轻松转换 ...
  • Unix时间戳和Java中的时间戳的区别

    万次阅读 2019-09-29 18:30:22
    在这之前首先得介绍一下Unix时间戳Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 但是Java中很多获取时间戳的API并不是获取到Unix时间戳,而是获取到从1970年1月1日(UTC/GMT...
  • 1. Unix时间戳 UNIX时间戳Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。 UNIX时间戳的0按照ISO 8601规范为 :1970...
  • C++ 获取Unix时间戳

    千次阅读 2019-04-11 20:50:23
    什么是Unix时间戳Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用...
  • 文章目录什么是时间戳头文件time.h介绍UNIX时间戳转北京时间北京时间转UNIX时间戳写成函数和调用示例 什么是时间戳 准确的说,应该是unix时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。...
  • Unix时间戳与标准时间格式互换

    千次阅读 2018-12-23 09:23:07
    Unix时间戳格式便于信息存储和传播,而标准时间格式可读性强。这二者在嵌入式程序中往往需要转换格式。UNIX时间戳的起点是1970年1月1日0时0分0秒,而从1970年到2100年之间每4年中间是一个闰年,即4年1个周期,共1461...
  • UNIX时间戳的应用-JAVA

    万次阅读 2011-05-11 17:53:00
    概念: <br /> System.currentTimeMillis() :返回当前系统的毫秒数,由于取得的是毫秒数,所以在处理UNIX时间戳的时候需要转换成秒  也就是:  long epoch = System.currentTimeMillis()/...
  • Pandas读取csv文件时,时间会自动显示为‘YYYY-MM-DD HH:MM:SS’的格式,那么如果想要将这个时间转换为 Unix时间戳 呢? 先科普一下,什么是 Unix时间戳 呢? Unix时间戳 是一种时间表示方式,是一个整型值,代表...
  • 随着读者的数量越来越多,总不免被问到一些“面向搜索引擎”的问题,比如说:“Java 怎么与 Unix 时间戳互转啊?”期初我很受不了,问得多了我就习惯了,于是就打算把这些小知识点统一写成文章,到时候直接扔给读者...
  • MySQL中unix时间戳的小知识

    千次阅读 2016-10-31 14:37:59
    最近在一家公司实习所做的项目后台...unix时间戳是从1970年1月1日0时0分0秒开始计算秒数的一个数值,在最近几年里,在数据库中存放的应该都是以1开头的一串11位数字,所以,刚好在mysql中以int(11)型存储。为什么要用u
  • UNIX时间戳的UTC(协调世界时)

    千次阅读 2019-03-24 19:20:33
    Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix 系统、类Unix...
1 2 3 4 5 ... 20
收藏数 64,808
精华内容 25,923
关键字:

unix时间戳