热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言零碎记录之Linux下C语言关于时间的函数

在手册上有timectimegmtimelocaltimeasctimemktimesettimeofday,gettimeofday等时间函数还有UTC和本机时间和这些函数的区别.

在手册上有 time ctime  gmtime localtime asctime mktime settimeofday,gettimeofday等时间函数

还有UTC和本机时间和这些函数的区别.了解这些 是linux时间编程必须得!

首先说基本的结构体和typedef 以及define:

time_t  

#ifndef __TIME_T
#define __TIME_T /* 避免重复定义 time_t */
typedef long time_t; /* 时间值time_t 为长整型的别名*/
#endif

使用方法是 time(&time_tvar);这样time函数会返回 且 给这个地址的time_t类型的变量赋值为一个单位为秒的值(从1970-1-1 0:0:0到现在这一秒的数目,其最大是32位(4294967296),但是没有unsigned只好一半;2011.12.22大约是1324544508,距离其饱满大约还有几十年,即使是unsigned,从1970年开始 只有132.95年,到2103年(4194288000),这个数值将溢出..汗,下次再设计的时候 希望不要再考虑 几个字节.应该尽量的大...)

对于从1970年到现在的秒,我自己也写了一个算法:

int getDaysSinceYear(){//0-365 not including this year!
time_t t;time(&t);
struct tm *p;
p=localtime(&t);
return p->tm_yday;
}


int getDaysSinceYear2(int year,int mon,int day){//这个是另外一个算法,范围1-366.所以应该-1 来达到上面的目的
int myyday=0;
mon--;//last Month and before
while(mon>0){//from 1 to last month!!!!!!!!!!
switch(mon){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:myyday+=31;break;
case 4:
case 6:
case 9:
case 11:myyday+=30;break;
case 2:myyday+=28;break;
default:break;
}
mon--;
}
myyday+=day;//And Plus this month's days
if(year%4==0)myyday+=1;// 2 yue if it is 29 days!!!
return myyday;
}

int getSecondsByTime(int year,int month,int days,int hour,int minute,int second){
//input format : 2011 11 11 11 11 11

printf("%d-%d-%d %d:%d:%d == input time\n",year,month,days,hour,minute,second);

int daySecOnds=24*60*60;
secOnds=hour*60*60+minute*60+second;//this year!
seconds+=(getDaysSinceYear())*daySeconds;
year--;//so not including this year!
for(;year>=1970;year--){//1970 - last year!
seconds+=365*daySeconds;
if(year%4==0)seconds+=daySeconds;
}
seconds-=8*60*60;//UTC Time .Current +8 hours beijing!
printf("%d == seconds(1970) in UTC\n",seconds);
return seconds;
}

最后获得的秒我有一个操作 :seconds-=8*60*60;为什么这么做?因为 我的电脑设置显示本地时间(即不是UTC时间)

如果按照UTC时间那需要+8个小时的.(windows上也默认是local时间,不是UTC的,所以经常出现俩时间不同步的问题,只要取消linux的UTC就可以了,在/etc/rc.conf类似的文件中设置我的是archlinux)

这个时间是从BIOS获取的,操作系统要处理这个时间,如果以UTC时间来处理,那么把BIOS时间当 UTC+0的时间,我们设置了UTC的timezone区域是 北京 UTC+8,所以linux此时就会把系统时间+8个小时就超时了...(后来我改成local时间,重启系统,时间恢复,比之前-8小时,一些文件的时间就惨了..提示 比现在靠后8小时...),所以time()是UTC+0的时间,如果系统设置UTC timezone为+0 我想就没着问题了吧...汗啊..谁叫我们的时间比他们UTC+0时区要早8个小时呢.

即使改成系统时间为BIOS本地时间,在编程他还是获得的是UTC时间,我们如果要获得当前的时间,需要-8小时.太恶心了.

从时间变成秒,linux没有直接的函数.但是从秒变成 时间的结构体就有了!!gmtime(&time_tVar)和localtime(&time_tVar);

这俩的区别就是 UTC,又是它 恶心啊...秒是当前时间的秒,UTC+0,使用gmtime获得UTC+0的时间,localtime获得本地时间UTC+8,localtime是正确的.

 现在时间就是下面的这个...还是说明 t 是UTC+0的时间.

总之这个时间编程中UTC是比较烦人的..还有一个问题是: Java 中可以获得微妙,秒后 有1000*1000的进位,如果用C来把Java的时间转换成现实时间呢???

 

 


 


 

 

 


推荐阅读
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
author-avatar
子幽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有