unix时间转本地时间_数据库 unix时间转本地时间 - CSDN
  • Linux下UNIX时间戳(UNIX timestamp)转本地时间

    需要注意的:

    • time函数,可以传入time_t类型的指针,如果为NULL,那么返回的值是函数内部的缓冲去
    • localtime函数返回的指针也是函数内部缓冲区的地址,重复调用,那么最后一次传入的参数将被转换

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include <time.h>
    
    int main(int argc, char **argv)
    {
    	struct tm *local_start = NULL, *local_stop = NULL;
    
    	time_t now1 = 0, now2 = 0;
    	
    	now1 = time(NULL);
    	
    	sleep(3);
    
    	now2 = time(NULL);
    	
    	printf("%lu, %lu\n", now1, now2);
    	
    	local_start = localtime(&now1);
    
    	printf("%d-%d-%d %d:%d:%d\n", local_start->tm_year + 1900, local_start->tm_mon + 1, local_start->tm_mday, local_start->tm_hour, local_start->tm_min, local_start->tm_sec);
    
    	local_stop = localtime(&now2);
    	
    	printf("%d-%d-%d %d:%d:%d\n", local_stop->tm_year + 1900, local_stop->tm_mon + 1, local_stop->tm_mday, local_stop->tm_hour, local_stop->tm_min, local_stop->tm_sec);
    
    	return 0;
    }

    展开全文
  • 我们平常说时间都说的几点几分几秒,星期几,但是在计算机里面并不是直接使用我们所说的时间,而是使用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

    展开全文
  • func Get_time() ...{ //获取当前时间 QQ29295842  // now := time.Now()  // year, mon, day := now.UTC().Date()  // hour, min, sec := now.UTC().Clock()  // zone, _ := now.UT


    func Get_time() string { //获取当前时间

    QQ29295842

        //    now := time.Now()
        //    year, mon, day := now.UTC().Date()
        //    hour, min, sec := now.UTC().Clock()
        //    zone, _ := now.UTC().Zone()
        //    fmt.Printf("UTC time is %d-%d-%d %02d:%02d:%02d %s\n",
        //        year, mon, day, hour, min, sec, zone)
    
    
        now := time.Now()
        year, mon, day := now.Date()
        hour, min, sec := now.Clock()
        //zone, _ = now.Zone()
        //    fmt.Printf("local time is %d-%d-%d %02d:%02d:%02d %s\n",
        //        year, mon, day, hour, min, sec, zone)
        return fmt.Sprintf("%d-%d-%d %02d:%02d:%02d", year, mon, day, hour, min, sec)
    }

    golang时间处理
    相关包 "time"

    • 时间戳 
      当前时间戳

      fmt.Println(time.Now().Unix())
      # 1389058332
    • str格式化时间
      当前格式化时间

      fmt.Println(time.Now().Format("2006-01-02 15:04:05"))  // 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5
      # 2014-01-07 09:42:20
    • 时间戳转str格式化时间

      str_time := time.Unix(1389058332, 0).Format("2006-01-02 15:04:05")
      fmt.Println(str_time)
      # 2014-01-07 09:32:12
    • str格式化时间转时间戳
      这个比较麻烦

      the_time := time.Date(2014, 1, 7, 5, 50, 4, 0, time.Local)
      unix_time := the_time.Unix()
      fmt.Println(unix_time)
      # 389045004

      还有一种方法,使用time.Parse

      the_time, err := time.Parse("2006-01-02 15:04:05", "2014-01-08 09:04:41")
      if err == nil {
              unix_time := the_time.Unix()
      	fmt.Println(unix_time)		
      }
      # 1389171881
    • ing

    展开全文
  • 在Linux C或C++编程中,因为应用场景的不同,经常会遇到各种时间之间的装换,有时需要BCD时间,有时需要Unix时间戳,也有叫绝对时间的。这里介绍几种时间格式转换的应用。 Unix时间戳:  Unix时间戳是一个绝对值,...

        在Linux C或C++编程中,因为应用场景的不同,经常会遇到各种时间之间的装换,有时需要BCD时间,有时需要Unix时间戳,也有叫绝对时间的。这里介绍几种时间格式转换的应用。

    Unix时间戳:

        Unix时间戳是一个绝对值,表示距离时间(1970-1-1, 00:00:00)的秒数。在C\C++ 语言中,用数据类型time_t 表示时间戳,time_t 本质上是一个long int。获取当前时间的时间戳代码如下所示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(int argc, const char * argv[])
    {
    	time_t now;
    	time(&now);
    	printf("Now:%ld \n",now);
    }
    

    行结果为:

    biao@ubuntu:~/test/test$ ./a.out 
    Now:1515229831 
    biao@ubuntu:~/test/test$

    BCD时间:

        所谓BCD时间就是以BCD码形式表示的时间。比如整型0x201801061647 表示2018年1月6日16时47分。

    下面举例几种BCD时间的转换:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    /***************************************************************************
    *函数名称:Char2Bcd
    *函数介绍:字符串转BCD
    *输入参数:-buf:指向字符串
    *输出参数:无
    *返回值  :转换后的双精度值
    *修改历史:
    ***************************************************************************/
    char Char2Bcd(char i_cHexData)
    {
       char i;
       i=((i_cHexData%100)/10)*16+(i_cHexData%10);
       return i;
    }
    
    /***************************************************************************
    *函数名称:Get_BCDTime7
    *函数介绍:转换为BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值  :无
    *修改历史:
    ***************************************************************************/
    void Get_BCDTime7(time_t i_tTime,char* o_cpBcdTime)
    {
    	struct tm *time;
    	time=localtime(&i_tTime);
    	o_cpBcdTime[0]=Char2Bcd((time->tm_year+1900)/100);
    	o_cpBcdTime[1]=Char2Bcd((time->tm_year+1900)%100);
    	o_cpBcdTime[2]=Char2Bcd(time->tm_mon+1);
    	o_cpBcdTime[3]=Char2Bcd(time->tm_mday);
    	o_cpBcdTime[4]=Char2Bcd(time->tm_hour);
    	o_cpBcdTime[5]=Char2Bcd(time->tm_min);
    	o_cpBcdTime[6]=Char2Bcd(time->tm_sec);
    }
    
    /***************************************************************************
    *函数名称:Get_CurBCDTime6 
    *函数介绍:转换为BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值  :无
    *修改历史:
    ***************************************************************************/
    void Get_BCDTime6(time_t i_tTime,char* o_cpBcdTime)
    {
    	struct tm *time;
    	time=localtime(&i_tTime);
    	o_cpBcdTime[0]=(unsigned char)((((time->tm_year-100)/10)<<4)|((time->tm_year-100)%10));
    	o_cpBcdTime[1]=(unsigned char)((((1+time->tm_mon)/10)<<4)|((1+time->tm_mon)%10));
    	o_cpBcdTime[2]=(unsigned char)((((time->tm_mday)/10)<<4)|((time->tm_mday)%10));
    	o_cpBcdTime[3]=(unsigned char)((((time->tm_hour)/10)<<4)|((time->tm_hour)%10));
    	o_cpBcdTime[4]=(unsigned char)((((time->tm_min)/10)<<4)|((time->tm_min)%10));
    	o_cpBcdTime[5]=(unsigned char)((((time->tm_sec)/10)<<4)|((time->tm_sec)%10));
    }
    
    /***************************************************************************
    *函数名称:Get_CurBCDTime6
    *函数介绍:获取当前BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值  :无
    *修改历史:add by lianzihao 2016-09-13
    ***************************************************************************/
    void Get_CurBCDTime6(char* o_cpBcdTime)
    {
            time_t lt=0;   
            lt = time(NULL);
            struct tm * pCurTime = localtime(<);
    
            o_cpBcdTime[0]=(unsigned char)((((pCurTime->tm_year-100)/10)<<4)|((pCurTime->tm_year-100)%10));
            o_cpBcdTime[1]=(unsigned char)((((1+pCurTime->tm_mon)/10)<<4)|((1+pCurTime->tm_mon)%10));
            o_cpBcdTime[2]=(unsigned char)((((pCurTime->tm_mday)/10)<<4)|((pCurTime->tm_mday)%10));
            o_cpBcdTime[3]=(unsigned char)((((pCurTime->tm_hour)/10)<<4)|((pCurTime->tm_hour)%10));
            o_cpBcdTime[4]=(unsigned char)((((pCurTime->tm_min)/10)<<4)|((pCurTime->tm_min)%10));
            o_cpBcdTime[5]=(unsigned char)((((pCurTime->tm_sec)/10)<<4)|((pCurTime->tm_sec)%10));
    }
    
    /***************************************************************************
    *函数名称:Get_CurBCDTime7
    *函数介绍:获取当前BCD码格式时间
    *输入参数:-*time:
    *输出参数:无
    *返回值  :无
    *修改历史:
    ***************************************************************************/
    void Get_CurBCDTime7(char* o_cpBcdTime)
    {
    	time_t tt;
    	struct tm *curtime;
    
    	time(&tt);
    	curtime=localtime(&tt);
    	o_cpBcdTime[0]=Char2Bcd((curtime->tm_year+1900)/100);
    	o_cpBcdTime[1]=Char2Bcd((curtime->tm_year+1900)%100);
    	o_cpBcdTime[2]=Char2Bcd(curtime->tm_mon+1);
    	o_cpBcdTime[3]=Char2Bcd(curtime->tm_mday);
    	o_cpBcdTime[4]=Char2Bcd(curtime->tm_hour);
    	o_cpBcdTime[5]=Char2Bcd(curtime->tm_min);
    	o_cpBcdTime[6]=Char2Bcd(curtime->tm_sec);
    }
    
    #define LEN		7
    int main(void)
    {
    	char l_arrBcdtime[LEN] ={0};
    	Get_CurBCDTime7(l_arrBcdtime);
    	printf("Get_CurBCDTime7 :");
    	for(int i=0;i<LEN;i++)
    	{
    		printf("%02x",l_arrBcdtime[i]);
    	}
    
    	Get_CurBCDTime6(l_arrBcdtime);
    	
    	printf("\nGet_CurBCDTime6 :");
    	for(int i=0;i<LEN-1;i++)
    	{
    		printf("%02x",l_arrBcdtime[i]);
    	}
    	printf("\n");
    	return 0;
    }
    
    运行结果为:

    biao@ubuntu:~/test/test$ gcc time.c
    biao@ubuntu:~/test/test$ ./a.out 
    Get_CurBCDTime7 :20180106171651
    Get_CurBCDTime6 :180106171651
    biao@ubuntu:~/test/test$ 

        如果需要将我们常用的时间格式转换回Unix时间戳,我们可以使用系统函数strptime来实现,strptime与函数strftime

    函数刚好相反,strftime是将Unix时间戳转换为各种时间格式。

    strptime函数:

    该函数的简单应用如下:将时间转换为Unix时间戳

    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    
    long Time2UnixTime(void)
    {
    	struct tm tmp_time;
    	strptime("2018-01-6 15:10:01", "%Y-%m-%d %H:%M:%S", &tmp_time);
    	time_t t = mktime(&tmp_time);
    	return t;
    }
    
    int main(void)
    {
    	int l_s32UnixTime = 0;
    	l_s32UnixTime = Time2UnixTime();
    	printf("l_s32UnixTime = %d \n",l_s32UnixTime);
    	return 0;
    }
    运行结果:

    biao@ubuntu:~/test/test$ ./a.out 
    l_s32UnixTime = 1515222601 
    biao@ubuntu:~/test/test$ 

    strftime:

    strftime函数功能很强大,可以将时间格式化为其他很多种的格式。它的原型如下:
    size_t strftime(
         char *strDest,
         size_t maxsize,
         const char *format,
         const struct tm *timeptr 
    );
    我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。
    函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。
    %a 星期几的简写 
    %A 星期几的全称 
    %b 月分的简写 
    %B 月份的全称 
    %c 标准的日期的时间串 
    %C 年份的后两位数字 
    %d 十进制表示的每月的第几天 
    %D 月/天/年 
    %e 在两字符域中,十进制表示的每月的第几天 
    %F 年-月-日 
    %g 年份的后两位数字,使用基于周的年 
    %G 年分,使用基于周的年 
    %h 简写的月份名 
    %H 24小时制的小时 
    %I 12小时制的小时
    %j 十进制表示的每年的第几天 
    %m 十进制表示的月份 
    %M 十时制表示的分钟数 
    %n 新行符 
    %p 本地的AM或PM的等价显示 
    %r 12小时的时间 
    %R 显示小时和分钟:hh:mm 
    %S 十进制的秒数 
    %t 水平制表符 
    %T 显示时分秒:hh:mm:ss 
    %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
    %U 第年的第几周,把星期日做为第一天(值从0到53)
    %V 每年的第几周,使用基于周的年 
    %w 十进制表示的星期几(值从0到6,星期天为0)
    %W 每年的第几周,把星期一做为第一天(值从0到53) 
    %x 标准的日期串 
    %X 标准的时间串 
    %y 不带世纪的十进制年份(值从0到99)
    %Y 带世纪部分的十制年份 
    %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
    %% 百分号

        如果想显示现在是几点了,并以12小时制显示,就象下面这段程序:

    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    
    int main(void)
    {
    	struct tm *ptr;
    	time_t lt;
    	char str[80];
    	lt=time(NULL);
    	ptr=localtime(<);
    	strftime(str,100,"It is now %I %p",ptr);
    	printf("%s \n",str);
    	return 0;
    }
    

    运行结果:

    biao@ubuntu:~/test/test$ ./a.out     
    It is now 05 PM 
    biao@ubuntu:~/test/test$ gcc timer.c
    如果要显示全部的时间,则如下:

    #define _XOPEN_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    void main( void )
    {
        struct tm *newtime;
        char tmpbuf[128];
        time_t lt1;
        time(<1);
        newtime=localtime(<1);
        strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
        printf("%s\n",tmpbuf);
    }
    
    运行结果为:

    biao@ubuntu:~/test/test$ gcc timer.c 
    biao@ubuntu:~/test/test$ ./a.out 
    Today is Saturday, day 06 of January in the year 2018.
    
    biao@ubuntu:~/test/test$ 







    展开全文
  • UNIX时间戳 : 13位/10位 (毫秒/秒) 北京时间转换为13位时间戳 : UTC+8--&gt;UTC--&gt;时间戳 e.g :  DECLARE @DATE DATETIME SET @DATE = DATEADD(HOUR,-8,'2018-12-07 14:39:27.073') --UTC SELECT...
  • 1.UTC时间 与 GMT时间 我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。 2.UTC时间 与 本地时 UTC + 时区差 = 本地时间 ...那么,UTC = 本地时间(北京时间)
  • 话不多说,直接上代码 #include “stdio.h” #include &amp;amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;amp;amp;amp;...amp
  • 执行时间与本地时间有误差 时间戳:2019/01/16 02:36:13 本地时:2019-01-16 10:36:10 正好相差8小时 安装ntp服务同步时间也无效最后翻找官方文档查看unix_timestamp获取时间属性: Converts time string...
  • //时间测试,将unix timestamp 和本地时间进行转换 //0x5a603bfe 北京时间 2018/1/18 14:17:34 /* 下面打印是的格林威治标准时间 年:118 月:0 日:18 时:6 分:17 秒:34 格林威治标准时间比北京时间晚8个小时 */...
  • 时间戳转本地时间在网上找了一上午,中午研究出来一个,同时进行了一些改进。.h文件//时间戳转本地时间。returnType=0,返回年月日时分秒,returnType=1,返回年月日,returnType=2,返回时分秒。time_t 单位是秒。...
  • 工作上用到这个还挺多的,做个简单的随笔,以后查询的时候比较方便: ... 代码注释里尽量写的比较清楚了 ...head> meta charset="UTF-8"> title>时间与时间戳互相转换title> head> body> scri
  • 首先明确几个概念,UTC/GMT、unix时间和时区。UTC/GMT表示世界协调时,是格林尼治的时间,格林尼治是一个经过本初子午线的地方;unix时间一般单位是秒,表示从UTC的1970-1-1的0点开始到某个时点所经过的秒数;由于...
  • 先来扫盲一下: unix time stamp翻译为时间戳, 就是...从unix time stamp到常规时间: #include <iostream> #include <ctime> using namespace std; void unixTime2Str(int n, char strTime[], int b...
  • Unix时间转换

    2014-05-15 11:50:29
    Unix时间是一种UNIX或类UNIX系统使用的时间表示方式,定义为从协调世界时UTC 1970年01月01日00时00分00秒起至现在的总秒数。相关知识请参考博文 UNIX时间及相关概念
  • Unix时间和日期

    2017-08-07 09:02:36
    时间和日期历程UNIX内核提供的...UNIX在这方面与其他操作系统的区别是:1)以协调统一时间而非本地时间计时;2)可自动进行转换,如变换到夏令时;3)将时间和日期作为一个量值保存。time函数:返回当前时间和日期。#i
  • UNIX内核提供的基本时间服务时计算自协调世界...UNIX在这方面与其他操作系统的区别是: 1)以协调同一时间而非本地时间计时 2)可自动进行转换,如变换到夏令时 3)将时间与日期作为一个量值保存time函数返回当...
  • //之前试了好多,转换的都成了1970,以下的方法可以转换成正常的日期public static void main(String[] args) { SimpleDateFormat sdf = new ... Long timestamp = Long.parseLong("Unix时间戳")*1000; S
  • 1.toTime_t()转变为1506578023这样的时间戳 ... //获取当前时间 int timeT = time.toTime_t(); //将当前时间转为时间戳  { 与toTime_t()功能相反的是fromTime_t(),把时间戳转为QDateTime类型。因为这个方法是静态
  • 还有就是UTC到本地时间的转换, 已知道一个字符串的UTC时间,如何转换为对应的本地时间. C标准时间库+扩展库具备这些关键转换. 说明 Coordinated Universal Time 世界统一时间, 世界标准时间. 或...
  • C语言实现就麻烦很多了,需要先成tm类型,再得到它的Unix时间戳。附上实现代码: #include #include int strtotime(char datetime[]) { struct tm tm_time; int unixtime; strptime(datetime
1 2 3 4 5 ... 20
收藏数 136,140
精华内容 54,456
关键字:

unix时间转本地时间