#include <unistd.h> int main() { usleep(1000000); // 等待1秒,因为1秒 = 1000000微秒 sleep(3); // 等待1秒 return 0; } |
|
|
|
|
时间化秒
1天24小时,1小时60分钟,1分钟60秒,这是定的 不定的是,1个月有多少天,1年有多少天,这要分情况讨论
一个月有多少天
1、3、5、7、8、10、12 每月31天,4、6、9、11为30天。 2月正常为28天,如果为闰年,则多一天为29天。 一三五七八十腊,三十一天永不差
什么是闰年
1、能被4整除,但不能被100整除; 2、能被400整除; leap year英/ˈliːp jɪə(r)/ 美/ˈliːp jɪr/ 闰年
#include <stdio.h> #define is_leap_year(year) (((year) % 400 == 0) || ((year) % 4 == 0 && (year) % 100 != 0)) ? 1:0 int main (int argc, char** argv) { printf("is leap year:%d\n",is_leap_year(2013));//is leap year:0 printf("is leap year:%d\n",is_leap_year(2000));//is leap year:1 return 0; }
自定义C时间转时间戳
#include <stdio.h> //闰年判断 #define is_leap_year(year) (((year) % 400 == 0) || ((year) % 4 == 0 && (year) % 100 != 0)) ? 1:0 //判断一年2月有几天 int days_byY2(int year){ if(is_leap_year(year)){//闰年 return 29; } return 28; } //获取公元1970年1月1日0时0分0到指定year的天数 int days_byYY(int year_end ){ int i; int day_sum = 0; for(i = 1970; i<year_end;i++){ int day_one_year = 7*31 + 4*30 + 28;//7*31 + 4*30 + 28=365 if(is_leap_year(i)){//闰年 day_one_year = day_one_year + 1; } day_sum = day_sum + day_one_year; } return day_sum; } //判断指定年月有几天 int days_byM(int year, int month){ int day = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 4: case 6: case 9: case 11: day = 30; break; case 2: day = days_byY2(year); break; default: break; } return day; } //从year年month月到公元1970年1月1日0时0分0的天数 int days_byYM(int year, int month){ //月份天计算 int day_mon_sum = 0,m=0; for(m=1;m<month;m++){ day_mon_sum= day_mon_sum + days_byM(year,m); } int day_year_sum=days_byYY(year); int day_all = day_year_sum + day_mon_sum; return day_all; } //从year年month月day日 到公元1970年1月1日0时0分0的天数 int days_byYMD(int year, int month, int day){ //-1是不包括最后一天,月的话不包括最后一天,年不包括最后一年 int day_all = days_byYM(year,month) + day -1 ; return day_all; } //秒数,从公元1970年1月1日0时0分0秒 int sec_YmdHms(int year, int month, int day, int hour, int minute, int second ){ int days = days_byYMD(year,month,day); //本人也不知道这18000是哪来的,跟Python对比,少了18000(5个小时),就加在这里 //本人相信Python计算结果,肯定有个什么说法的 int sec = days*24*60*60 + hour*60*60 + minute*60 + second +18000; return sec; } int main (int argc, char** argv) { printf("is leap year:%d\n", is_leap_year(1792));//is leap year:1 printf("is leap year:%d\n", is_leap_year(2000));//is leap year:1 //判断指定年月有几天 int day = days_byM(1971,1); printf("days = %d\n",day);//days = 31 //判断指定年到1970年1月1有几天 int day1 = days_byYY(1972); printf("day1 = %d\n",day1);//day1 = 730 int day2 = days_byYM(1972,3); printf("day2 = %d\n",day2);//day2 = 790 int day3 = days_byYMD(2022, 12, 21); printf("day3 = %d\n",day3);//day3 = 19347 long int sec = sec_YmdHms(2022, 12, 21, 19, 10, 20); printf("sec=%ld\n",sec);//sec=1671667820 long int sec2 = sec_YmdHms(2023, 11, 10, 17, 50, 20); printf("sec2=%ld\n",sec2);//sec2=1699656620 return 0; }
$ gcc b.c $ ./a.out is leap year:1 is leap year:1 days = 31 day1 = 730 day2 = 790 day3 = 19347 sec=1671667820 sec2=1699656620
对比Python时间戳
import datetime,time import pandas as pd dt = datetime.datetime(2022, 11, 19, 19, 10, 20) # 转struct_time tt = dt.timetuple() # struct_time 转秒数 seconds = time.mktime(tt) seconds 1668903020.0
对比pandas时间戳
import pandas as pd data = pd.DataFrame(["2022-11-19 19:10:20"],columns=["tim"]) # 增加一个新的时间列,将时间转换为以秒为单位的整数 data["tim_num"] = data["tim"].apply(lambda x:time.mktime(time.strptime(x,'%Y-%m-%d %H:%M:%S'))) data.astype("string") tim tim_num 0 2022-11-19 19:10:20 1668903020.0
经对比,结果完全一致,毕竟Pandas是做数据处理的,跟它一样,至少正确性上暂时没啥问题
int main (int argc, char** argv) { //2022-11-19 19:10:20 long int sec = sec_YmdHms(2022, 11, 19, 19, 10, 20); printf("sec=%ld\n",sec);//sec=1668903020 return 0; }
mktime
mktime可以将时间转化为时间戳,但个人使用过程中出了点小问题,导致不敢用,才写了前面的代码 问题如下,先记录一下
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //start:索引位置 //count:取多少个字符 void str_get(char** res, char* s1,int start,int count){ *res = (char*)malloc((count+1)*sizeof(char)); int s_size = strlen(s1); int i; if(count>s_size){ count = s_size; } int end = start+count; // printf("start:%d,end:%d\n",start,end); int index=0; for(i=start;i<end;i++){ // printf("c=%c\n",s1[i]); (*res)[index++] = s1[i]; } } /* * struct tm * { * int tm_sec; // seconds after the minute - [0, 59] * int tm_min; // minutes after the hour - [0, 59] * int tm_hour; // hours after midnight - [0, 23] * int tm_mday; // day of the month - [1, 31] * int tm_mon; // months since January - [0, 11] * int tm_year; // years since 1900 * int tm_wday; // days since Sunday - [0, 6] * int tm_yday; // days since January 1 - [0, 365] * int tm_isdst; // Daylight Saving Time flag * }; */ int strtotime(char t_str[],time_t *t){ char arr_str[20]; strcpy(arr_str,t_str); time_t timeSec=time (NULL); //获取1970.1.1至当前秒数time_t char* year_str; char* month_str; char* day_str; char* hour_str; char* minute_str; char* second_str; str_get(&year_str,t_str,0,4); str_get(&month_str,t_str,5,2); str_get(&day_str,t_str,8,2); str_get(&hour_str,t_str,11,2); str_get(&minute_str,t_str,14,2); str_get(&second_str,t_str,17,2); printf("%s年%s月%s日 %s时%s分%s秒\n",year_str,month_str,day_str,hour_str,minute_str,second_str); int year,month,day,hour,minute,second; sscanf(year_str,"%d",&year); sscanf(month_str,"%d",&month); sscanf(day_str,"%d",&day); sscanf(hour_str,"%d",&hour); sscanf(minute_str,"%d",&minute); sscanf(second_str,"%d",&second); printf("%d年%02d月%02d日 %02d时%02d分%02d秒\n",year,month,day,hour,minute,second); free(year_str); free(month_str); free(day_str); free(hour_str); free(minute_str); free(second_str); //时间转秒数 //定义函数 time_t mktime(strcut tm * timeptr); //函数说明 mktime()用来将参数timeptr所指的tm结构数据转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数。 struct tm tt; tt.tm_sec = second; tt.tm_min = minute; tt.tm_hour = hour; tt.tm_mday = day; tt.tm_mon = month-1; tt.tm_year = year - 1900; *t = mktime(&tt); return 0; } int main() { time_t t; char t_str[20] = "2022-12-21 19:10:20"; if (strtotime(t_str,&t) == 0) { printf("t: %lld\n", t); } else { printf("时间字符串转换Unix时间戳失败\n"); } return 0; } /*不知为何在两个时间上跳动 ,1671667820-1671664220 = 3600,相差1小时整 (base) [xt@kl test]$ gcc t.c (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671664220 (base) [xt@kl test]$ (base) [xt@kl test]$ (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671667820 (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671664220 (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671664220 (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671664220 (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671664220 (base) [xt@kl test]$ ./a.out 2022年12月21日 19时10分20秒 2022年12月21日 19时10分20秒 t: 1671667820 */
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //闰年判断 #define is_leap_year(year) (((year) % 400 == 0) || ((year) % 4 == 0 && (year) % 100 != 0)) ? 1:0 //判断一年2月有几天 int days_byY2(int year){ if(is_leap_year(year)){//闰年 return 29; } return 28; } //获取公元1970年1月1日0时0分0到指定year的天数 int days_byYY(int year_end ){ int i; int day_sum = 0; for(i = 1970; i < year_end;i++){ int day_one_year = 7*31 + 4*30 + 28;//7*31 + 4*30 + 28=365 if(is_leap_year(i)){//闰年 day_one_year = day_one_year + 1; } day_sum = day_sum + day_one_year; } return day_sum; } //判断指定年月有几天 int days_byM(int year, int month){ int day = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 4: case 6: case 9: case 11: day = 30; break; case 2: day = days_byY2(year); break; default: break; } return day; } //从year年month月到公元1970年1月1日0时0分0的天数 int days_byYM(int year, int month){ //月份天计算 int day_mon_sum = 0,m=0; for(m=1;m < month;m++){ day_mon_sum= day_mon_sum + days_byM(year,m); } int day_year_sum=days_byYY(year); int day_all = day_year_sum + day_mon_sum; return day_all; } //从year年month月day日 到公元1970年1月1日0时0分0的天数 int days_byYMD(int year, int month, int day){ //-1是不包括最后一天,月的话不包括最后一天,年不包括最后一年 int day_all = days_byYM(year,month) + day -1 ; return day_all; } //秒数,从公元1970年1月1日0时0分0秒 int sec_YmdHms(int year, int month, int day, int hour, int minute, int second ){ int days = days_byYMD(year,month,day); //本人也不知道这18000是哪来的,跟Python对比,少了18000(5个小时),就加在这里 //本人相信Python计算结果,肯定有个什么说法的 int sec = days*24*60*60 + hour*60*60 + minute*60 + second +18000; return sec; } //start:索引位置 //count:取多少个字符 void str_get(char** res, char* s1,int start,int count){ *res = (char*)calloc((count+1),sizeof(char)); int s_size = strlen(s1); int i; if(count>s_size){ count = s_size; } int end = start+count; // printf("start:%d,end:%d\n",start,end); int index=0; for(i=start;i < end;i++){ // printf("c=%c\n",s1[i]); (*res)[index++] = s1[i]; } } int str_sec(char* t_str){ char arr_str[20]; strcpy(arr_str,t_str); char* year_str; char* month_str; char* day_str; char* hour_str; char* minute_str; char* second_str; str_get(&year_str,t_str,0,4); str_get(&month_str,t_str,5,2); str_get(&day_str,t_str,8,2); str_get(&hour_str,t_str,11,2); str_get(&minute_str,t_str,14,2); str_get(&second_str,t_str,17,2); // printf("%s年%s月%s日 %s时%s分%s秒\n",year_str,month_str,day_str,hour_str,minute_str,second_str); int year,month,day,hour,minute,second; sscanf(year_str,"%d",&year); sscanf(month_str,"%d",&month); sscanf(day_str,"%d",&day); sscanf(hour_str,"%d",&hour); sscanf(minute_str,"%d",&minute); sscanf(second_str,"%d",&second); // printf("%d年%02d月%02d日 %02d时%02d分%02d秒\n",year,month,day,hour,minute,second); free(year_str); free(month_str); free(day_str); free(hour_str); free(minute_str); free(second_str); int sec = sec_YmdHms(year, month, day, hour, minute, second); return sec; } int main() { char s2[20] = "2022-12-21 19:10:20"; int sec2 = str_sec(s2); printf("sec2=%d\n",sec2);//sec=1668903020 char* s1 = "2022-12-21 19:10:20"; int sec1 = str_sec(s1); printf("sec1=%d\n",sec1);//sec=1668903020 return 0; }
判断自1970-01-01 00:00:00以来的秒数
#include <sys/time.h> #include <stdio.h> int main (int argc, char** argv) { struct timeval tv = {}; int retVal = gettimeofday(&tv, NULL); if (0 == retVal) { printf("sec:%ld,usec:%ld since 1970-01-01 00:00:00 UTC\n", tv.tv_sec, tv.tv_usec); } return 0; }
$ gcc b.c $ ./a.out sec:1699596938,usec:66739 since 1970-01-01 00:00:00 UTC
自1970-01-01 00:00:00 +0000 (UTC)以来的秒数和微秒数。
这个微秒数指两个秒数之间的增量 #include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz); struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of DST correction */ }; tz:表示时区和夏令时信息。已废弃,设置为NULL。 int retVal = gettimeofday(&tv, NULL);
判断代码运行时间,毫秒级
#include <sys/time.h> #include <stdio.h> int main (int argc, char** argv) { struct timeval tv = {}; int retVal = gettimeofday(&tv, NULL); if (0 == retVal) { printf("sec:%ld,usec:%ld since 1970-01-01 00:00:00 UTC\n", tv.tv_sec, tv.tv_usec); } struct timeval start,end; gettimeofday(&start, NULL ); //个人代码 gettimeofday(&end, NULL ); double timeuse = ( end.tv_sec - start.tv_sec )*1000 + (end.tv_usec - start.tv_usec)/1000.0; printf("毫秒 : %f\n",timeuse); return 0; }
$ gcc b.c $ ./a.out sec:1699596789,usec:406460 since 1970-01-01 00:00:00 UTC 毫秒 : 0.000000