精华内容
下载资源
问答
  • C语言实现时间转换
    千次阅读
    2019-03-17 15:36:38

    注意:
    注意对闰年以及2月份天数的处理。

    /*------------------------------------
    功能:实现时间转换
    要求输出一个比输入时间晚16小时的时间;
    数据格式为:年 月 日 时 分;
    输入示例:
    3
    2008 03 01 08 30
    2018 01 01 09 30
    2019 12 31 24 30
    输出示例:
    2008 02 29 16 30
    2017 12 31 17 30
    2019 12 31 08 30
    -------------------------------------
    Author: Zhang Kaizhou
    Date: 2019-3-17 15:32:04
    ------------------------------------*/
    #include <stdio.h>
    #include <stdlib.h>
    #define N 10
    
    typedef struct node{
        int year, month, day, hour, minute;
        struct node * pnext;
    } Node;
    
    void time_transform(Node * p);
    void list_tail_insert(Node ** pphead, Node ** pptail, Node * p);
    void list_print(Node * phead);
    
    int main(){
        Node * phead = NULL, * ptail = NULL;
        int n, i;
        scanf("%d", &n);
        for(i = 0; i < n; i++){
            Node * pnew = (Node *)calloc(1, sizeof(Node));
            scanf("%d %d %d %d %d", &pnew->year, &pnew->month, &pnew->day, &pnew->hour, &pnew->minute);
            time_transform(pnew);
            list_tail_insert(&phead, &ptail, pnew);
        }
        list_print(phead);
    
        return 0;
    }
    
    void time_transform(Node * p){
        if(p->hour >= 16){ // 小时大于等于16时
            p->hour = p->hour - 16;
        }else{ // 小时小于16时
            if(p->day > 1){
                p->day -= 1;
                p->hour = p->hour + 8;
            }else{ // day = 1时
                if(p->month > 1){
                    p->month -= 1;
                    if(p->month == 1 || p->month == 3 || p->month == 5 || p->month == 7 ||
                       p->month == 8 || p->month == 10 || p->month == 12){
                        p->day = 31;
                    }else if(p->month == 2){
                        if((p->year % 4 == 0 && p->year % 100 != 0) || p->year % 400 == 0){
                            p->day = 29;
                        }else{
                            p->day = 28;
                        }
                    }else{
                        p->day = 30;
                    }
                    p->hour = p->hour + 8;
                }else{ // 在一月一日时
                    p->year -= 1;
                    p->month = 12;
                    p->day = 31;
                    p->hour = p->hour + 8;
                }
            }
        }
        return;
    }
    
    void list_tail_insert(Node ** pphead, Node ** pptail, Node * p){
        if(* pphead == NULL){
            * pphead = p;
            * pptail = p;
        }else{
            (* pptail)->pnext = p;
            * pptail = p;
        }
        return;
    }
    
    void list_print(Node * phead){
        while(phead != NULL){
            printf("%d %02d %02d %02d %02d\n", phead->year, phead->month, phead->day, phead->hour, phead->minute);
            phead = phead->pnext;
        }
        return;
    }
    
    
    更多相关内容
  • C语言实现时区转换函数的实例 时区转换函数 功能: 把时区1的时间转换成时区2的时间 参数: arg1 — 输入时间 arg2 — 时区1(也是arg1当前时间所在的时区) arg3 — 时区2(要转换的时区的时间)  要求: 参数...
  • 下面小编就为大家带来一篇C语言实现字符转unix时间戳的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • c语言,包含获取指定网口ip地址,mac地址,网关,以及c语言实现修改ip,网关,子网掩码,以及设置socket套接字加入到多播组的方法;可以实现linux下的time_t和字符串的相互转换
  • 主要介绍了C语言用栈实现十进制转换为二进制的方法,结合实例形式分析了C语言栈的定义及进制转换使用技巧,需要的朋友可以参考下
  • 分别用三个函数:输入(time_input)、输出(time_output)、转换(time_change)函数 代码如下:#include<iostream>#include<cstdlib>using namespace std;void time_input(int& hour,int& minute);void time_output...
  • //转换 unsigned long My_mktime(unsigned int year, unsigned int mon, unsigned int day, unsigned int hour, unsigned int min, unsigned int second) { unsigned int year_to_day = 0; unsigned int

    代码:

    #include <stdio.h>
    
    //转换
    //参数:year 为某一年的全称:如 2020年
    unsigned long My_mktime(unsigned int year, unsigned int mon, unsigned int day,
                                    unsigned int hour, unsigned int min, unsigned int second)
    {
        unsigned int year_to_day = 0;
        unsigned int mon_to_day = 0;
        unsigned int day_to_day = 0;
        /*把1月和2月当作上一年年底的最后两个月,让3月作为一年的第一个月*/
        if((mon -= 2) <= 0)
        {
            mon += 12;
            year -= 1;
        }
    
        year_to_day = (year - 1) * 365 + year / 4 - year / 100 + year / 400; //计算给出的年数到公元元年的天数
        mon_to_day = (367 * mon / 12) - 30 + 59; //计算给出的月数转换成天数
        day_to_day = day - 1; //当天不能计算上去,所以要减1
        /*719162是0001年1月1日到1970年1月1日所经历的天数*/
        return (((unsigned long)(((year_to_day + mon_to_day + day_to_day - 719162) * 24 + hour) * 60 + min) * 60) + second);
    }
    
    
    //测试
    int main(void)
    {
      printf("Time-Sec1:[%ld].\n",My_mktime(2020,10,16,9,50,20));
    
      printf("Time-Sec2+30:[%ld].\n",My_mktime(2020,10,16,9,50,50));
    
      return 0;
    }
    
    

    结果:
    在这里插入图片描述

    参考:
    https://www.cnblogs.com/panhao/p/6892037.html

    展开全文
  • 1.函数实现 #include <string.h> #include <stdio.h> #include <time.h> /* 判断是否闰年 */ #define IS_LEAP_YEAR(year) \ (((year) % 400 == 0) || ((year) % 4 == 0 && (year) % ...

     1.函数实现

    #include <string.h>
    #include <stdio.h>
    #include <time.h>
    
    /* 判断是否闰年 */
    #define IS_LEAP_YEAR(year)                                                     \
      (((year) % 400 == 0) || ((year) % 4 == 0 && (year) % 100 != 0)) ? true : false
    
    /**
     * @brief 星期的英文简写转换为对应的数字
     *
     * @param str 星期的简写字符串
     * @return int 返回星期对应的数字,-1表示转换失败
     */
    int week_abbreviation_to_num(const char *str) {
      const char *week_str_arr[] = {"Sun", "Mon", "Tue", "Wed",
                                    "Thu", "Fri", "Sat"};
    
      int i = 0;
      for (; i < 7; ++i) {
        if (strcmp(str, week_str_arr[i]) == 0) {
          break;
        }
      }
      if (i >= 7) {
        return -1;
      }
    
      return i;
    }
    
    /**
     * @brief 月份的英文简写转换为对应的数字
     *
     * @param str 月份的简写字符串
     * @return int 返回月份对应的数字(范围0~11),-1表示转换失败
     */
    int month_abbreviation_to_num(const char *str) {
      const char *month_str_arr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                                     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    
      int i = 0;
      for (i = 0; i < 12; ++i) {
        if (strcmp(str, month_str_arr[i]) == 0) {
          break;
        }
      }
      if (i >= 12) {
        return -1;
      }
    
      return i;
    }
    
    /**
     * @brief 字符串格式的时间转换为时间戳
     *
     * @param str 要转换的时间字符串,格式为week month day our:minute:second, 例如:
     * "Fri Feb 28 15:58:43 2021"
     * @param t 存放转换结果的time_t变量的地址
     * @return int 0: 转换成功,非0: 转换失败 
     */
    int strtotime(const char *str, time_t *t) {
      int year, day, hour, minute, second;
      char month[4] = {0}, week[4] = {0};
      struct tm tm_; /* 定义tm结构体 */
      bool is_leap_year = false;
    
      if (sscanf(str, "%s %s %d %d:%d:%d %d", week, month, &day, &hour, &minute,
                 &second, &year) != 7) {
        return -1;
      }
      /* 星期 */
      if ((tm_.tm_wday = week_abbreviation_to_num(week)) < 0) {
        return -2;
      }
      /* 月 */
      if ((tm_.tm_mon = month_abbreviation_to_num(month)) < 0) {
        return -3;
      }
      /*年*/
      if (year < 1900) {
        return -4;
      }
      is_leap_year = IS_LEAP_YEAR(year);
      
      if (day < 1) {
        return -5;
      }
      if (is_leap_year) {
        if ((tm_.tm_mon + 1) == 2 && day > 29)
          return -5;
      } else {
        if ((tm_.tm_mon + 1) == 2 && day > 28)
          return -5;
      }
      switch (tm_.tm_mon) {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
        if (day > 31) {
          return -5;
        }
        break;
      case 4:
      case 6:
      case 9:
      case 11:
        if (day > 30) {
          return -5;
        }
        break;
      default:
        break;
      }
    
      tm_.tm_mday = day; /* 日 */
      if (hour < 0 || hour > 56) {
        return -5;
      }
      tm_.tm_hour = hour; /* 时 */
      if (minute < 0 || minute > 59) {
        return -6;
      }
      tm_.tm_min = minute; /* 分 */
      if (second < 0 || second > 59) {
        return -7;
      }
      tm_.tm_sec = second; /* 秒 */
      /* 年,由于tm结构体存储的是从1900年开始的时间,所以tm_year为int临时变量减去1900
       */
      tm_.tm_year = year - 1900;
      tm_.tm_isdst = 0; /* 非夏令时 */
      /* 将tm结构体转换成time_t格式 */
      *t = mktime(&tm_);
    
      return 0;
    }

    2.实例

    const char *time_str = "Fri Feb 28 15:58:43 2021";
    
    time_t t;
    if (strtotime(time_str, &t) == 0) {
        printf("t: %lld\n", t);
    } else {
        printf("时间字符串转换Unix时间戳失败\n");
    }

    展开全文
  • 目录 一、什么是Unix时间戳 ...    2、unix时间戳需要先加上8个小时(即8 * 60 * 60 s)的秒数差,再进行转换得到北京时间。     3、实用工具传送门 → Unix时间戳和北京时间在线转换工具 ...

    一、什么是Unix时间戳

        1、Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

        2、Unix时间戳需要先加上8个小时(即8 * 60 * 60 s)的秒数差,再进行转换得到北京时间。

        3、实用工具传送门 → Unix时间戳和北京时间在线转换工具

    二、应用C语言库函数

    • 2.1、包含头文件 time.h

      #include<time.h>
      
    • 2.2、定义时间戳类型:time_t

      /* 时间戳类型,单位为秒,与uint32_t类型一样 */
      typedef unsigned int time_t;
      
    • 2.3、时间结构体 :tm

      struct tm {
          int tm_sec;   /* 秒钟,范围 0-60,偶尔的闰秒 */
          int tm_min;   /* 分钟,范围 0-59 */
          int tm_hour;  /* 小时,范围 0-23*/
          int tm_mday;  /* 日,范围 1-31 */
          int tm_mon;   /* 月份,范围 0-11 */
          int tm_year;  /* 年份,自从1900年 */
          int tm_wday;  /* 星期,范围 0-6 */
          int tm_yday;  /* 一年的第几天,范围 0-365 */
          int tm_isdst; /* 夏令时标志 */
      };
      
      • 注意:Unix时间戳和北京时间相互转换时,要进行时间修正

        1、Unix时间戳转换为北京时间前要进行时间补偿,要+(8 * 60 * 60) s

        2、年份自1900算起,转换为实际年份,要+1900

        3、月份范围0-11,转换为实际月份,要+1

        4、一年的第几天,范围 0-365,转换为一年的第几天,要+1

    • 2.4、库函数:struct tm *localtime(const time_t * )

      /***************************************
       ** 参数   :一个单位为秒的时间戳
       ** 返回值 :一个时间结构体
       ***************************************/
      struct tm *localtime(const time_t * )
      
    • 2.5、库函数:time_t mktime(struct tm *)

      /***************************************
       ** 参数   :一个时间结构体
       ** 返回值 :一个单位为秒的时间戳
       ***************************************/
      time_t mktime(struct tm *)
      

      注意:转换时不考虑tm结构的tm_wday和tm_yday,仅用tm_mday来决定日期。

    三、C语言实现Unix时间戳与北京时间的相互转换

    • 3.1、定义变量

      // 北京时间结构体
      typedef struct{
      	uint16_t year;		// 年
      	uint8_t  month;		// 月
      	uint8_t  day;		// 日
      
      	uint8_t  wday;		// 星期几
      	uint8_t  yday;		// 一年里的第几天
      
      	uint8_t  hour;		// 时
      	uint8_t  min;		// 分
      	uint8_t  sec;		// 秒	 
      }bj_time;
      
      // 定义一个北京时间结构体变量
      bj_time bjtime;
      
      // 定义一个单位为秒的 Unix时间戳
      time_t timestamp;
      
      /*
        	几个用于测试的时间戳和北京时间对应
      
      	 Unix时间戳         北京时间 
      	1609689918 = 2021-01-04 00:05:18 
      	1632325810 = 2021-09-22 23:50:10
      	1660809978 = 2022-08-18 16:06:18
      */
      
    • 3.2、Unix时间戳转为北京时间

      • 3.2.1、代码
         /***************************************
          ** 函数名: UnixToBeijingTime
          ** 参数  : unixtime 一个单位为秒的Unix时间戳
          ** 用途  : 将Unix时间戳转为北京时间
         ***************************************/
        void UnixToBeijingTime(time_t unixtime)
        {
        	// 定义一个时间结构体
        	struct tm *time;
        	
        	// 定义一个单位为秒的Unix时间戳
        	time_t unixtemp = unixtime;
        	
        	// 8个小时的时间补偿
        	unixtemp += 8 * 60 * 60;
        	
        	time = localtime(&unixtemp);
        	
        	bjtime.year  = time->tm_year;					// 年
        	bjtime.month = time->tm_mon;					// 月
        	bjtime.day	 = time->tm_mday;					// 日
        	
        	bjtime.wday	 = time->tm_wday;					// 星期几
        	bjtime.yday	 = time->tm_yday;					// 一年里的第几天
        	
        	bjtime.hour  = time->tm_hour;					// 时
        	bjtime.min   = time->tm_min;					// 分
        	bjtime.sec	 = time->tm_sec;					// 秒	
        	
        	// 时间修正
        	bjtime.year  += 1900;
        	bjtime.month += 1;
        	bjtime.yday	 += 1;
        	
        	printf("\n\r\tUnix时间戳:%d\n\r", unixtime);
        	
            printf("\n\r\t日期:%d-%02d-%02d 第%d天 星期%d 时间:%02d:%02d:%02d\n\r",
                    bjtime.year, bjtime.month, bjtime.day, bjtime.yday, 
        		    bjtime.wday, bjtime.hour , bjtime.min, bjtime.sec);
        }
        
        
        int main(void)
        {	
        	timestamp = 1609689918;   // 北京时间: 2021-01-04 00:05:18
        	UnixToBeijingTime(timestamp);
        
        	while(1)
        	{
        		
        	}
        }
        
      • 3.2.2、运行结果
        Alt
    • 3.3、北京时间转为Unix时间戳
      • 3.3.1、代码

        /***************************************
         ** 函数名: BeijingTimeToUnix
         ** 参数  : bjtimeArr 北京时间数组
         ** 用途  : 将北京时间转为Unix时间戳
        ***************************************/
        void BeijingTimeToUnix(uint8_t* bjtimeArr)
        {
        	// 定义一个时间结构体
        	struct tm time;
        	
        	// 定义一个单位为秒的Unix时间戳
        	time_t unixtemp;
        	
        	// 时间修正
        	time.tm_year = bjtimeArr[0] + 2000 - 1900;	// 年
        	time.tm_mon  = bjtimeArr[1] - 1;		    // 月
        	time.tm_mday = bjtimeArr[2];			    // 日
        	
        	time.tm_hour = bjtimeArr[3];				// 时
        	time.tm_min  = bjtimeArr[4];				// 分
        	time.tm_sec  = bjtimeArr[5];				// 秒	
        	
        	unixtemp = mktime(&time);
        	
        	// 8个小时的时间补偿
        	unixtemp -= 8 * 60 * 60;
        	
        	printf("\n\r\tUnix时间戳:%d\n\r", unixtemp);
        	
            printf("\n\r\t日期:%d-%02d-%02d 时间:%02d:%02d:%02d\n\r",
                       bjtimeArr[0] + 2000, bjtimeArr[1], bjtimeArr[2],
        			   bjtimeArr[3]       , bjtimeArr[4], bjtimeArr[5]);
        	
        }
        
        
        int main(void)
        {	
        	uint8_t bjtimeArr[6] = {22, 8, 18, 16, 6, 18};		// 1660809978 = 2022-08-18 16:06:18
        	BeijingTimeToUnix(bjtimeArr);
        	
        	while(1)
        	{
        		
        	}
        }		
        
      • 3.3.2、运行结果
        Alt

    展开全文
  • UTC时间相当于BJT减去8。 程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。 #include <stdio.h> int main() { int BJT=0; int UTC=0; printf("输入北京时间为:"); ...
  • 1、算法 ...当然了,C语言库函数:localtime就可以获得一个时间戳对应的具体日期了,这里 主要说的是实现的一种算法。 2、C语言代码实现 int nTime = time(NULL);//得到当前系统时间 int nDays = nT
  • unix时间转换网页工具 实现 time_t unix_time =0; int aa = 1639037675; unix_time = aa; struct tm* time1; time1 = localtime(&unix_time); time1->tm_year = time1->tm_year + 1900;//时间校正 time1-&...
  • C语言标准库里的获取时间函数及时间格式转换详解 头文件: #include <time.h> 相关库函数(截图摘自:https://www.runoob.com/cprogramming/c-standard-library-time-h.html) 相关数据结构: struct tm ...
  • C语言中转换时间的基本方法本文主要介绍了在C语言中转换时间的基本方法,分别是...C语言mktime()函数:将时间转换成经过的秒数头文件:#include 定义函数:time_t mktime(strcut tm * timeptr);函数说明:mkti...
  • C语言实现时间差计算

    千次阅读 2019-05-24 11:47:54
    C语言中有两个相关的函数用来计算时间差,分别是:time_t time( time_t *t)   与 clock_t clock(void)头文件: time.h计算的时间单位分别为: s   , ms time_t 和 clock_t 是...
  • 整个代码可直接编译运行;Unix时间戳转北京时间,用到“time.h”头文件,是C语言的标准库,使用...UTC时间转化成北京时间,思路:把UTC时间转换成时间戳,然后时间戳数值加上八小时,再把时间戳转化成北京时间。
  • 四、避免方法五、C语言实现 时间戳 与 年月日时分秒 的互换 一、前言   最近在开发esp32时遇到一个错误,经排查发现mktime()返回了-1。原来是向服务器获取的时间出错,服务器返回年份大于2038年,导致转换时间戳...
  • 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的...
  • // 以平年时间计算的秒数 result = (dt.tm_year - 1970) * 365 * 24 * 3600 + (mon_yday[isleap(dt.tm_year)][dt.tm_mon-1] + dt.tm_mday - 1) * 24 * 3600 + dt.tm_hour * 3600 + dt.tm_min * 60 + dt.tm_sec;...
  • C语言实现24位转换为8位位图

    热门讨论 2011-10-15 16:46:53
    绝度能用,代码完整,本人亲自测试,运行完美,能将24位位图转换为8位位图
  • } // 将北京时间转换为Unix时间戳 // year: 需要判断的年 // return:Unix时间戳(从1970/1/1 00:00:00 到现在的秒数) // note:没对输入参数正确性做判断 uint32_t covBeijing2UnixTimeStp(rtc_time_t *beijing...
  • 进制转换: 为什么使用二进制、八进制、十六进制? 由于现在的CPU只能识别高低两种电平,只能使用二进制数据进行计算 二进制虽然能够被计算机直接计算,但是不方便书写、记录,因此将数据以八进制方式为了更方便...
  • 农历信息包括二十四节气时间点、闰月、大小月、三伏、九九、干支、年号、农历节假日、属相等。 还可以进行农历和公历的日期对应转换,查询生辰八字。 支持自定义节日和纪念日,自定义时公历和农历是区分开的。 ...
  • C语言中常用的二进制与ASCII码互相转换指南,这是自己整理的。还请大家批评指正!
  • 最近遇到一个问题:数据库中存放的时间为UTC时间,但是现在要求都出来显示的时间为本地时间,所以就用C++实现了,下面这篇文章主要给大家介绍了关于C/C++标准库之转换UTC时间到local本地时间的方法,还有C++中获取...
  • 时间戳转北京时间C语言实现

    千次阅读 2019-07-22 10:49:52
    时间戳转北京时间C语言实现 #include “stdio.h” #define u8 unsigned char #define u16 unsigned shord #define u32 unsigned int //判断是否是闰年函数 //月份 1 2 3 4 5 6 7 8 9 10 11 12 //闰年 31 29...
  • 功 能: 将给定的日期和时间转换成ASCII码参数: tm为要转换的结构体返回值: 返回转换后的字符串指针补充:1. 将给定的日历时间tm转换为以下固定的25个字符格式的文本表示形式:DDD MMM dd hh:mm:ss YYYYDDD 一星期...
  • 可以实现linux下的time_t和字符串的相互转换
  • 格林威治时间转换显示 #include <stdio.h> #include <string.h> #include <time.h> typedef struct LocalTimeInformation { unsigned int year; unsigned int month; unsigned int day; ...
  • C语言实现格林威治时间转北京时间 【北京时间=GMT时间+8小时】 日期数据结构定义: typedef struct { uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; }time_t; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,747
精华内容 41,498
关键字:

c语言实现时间转换

友情链接: 005_JSaCR-master.rar