每天进步一点点——Linux系统时间来处理
转载请注明出处:http://blog.csdn.net/cywosp/article/details/25839551
- 真实时间:程序执行的时间,即程序启动到程序消亡所用时间或程序执行到如今所经过的时间
- 进程时间:一个进程所使用的CPU时间总量。适用于对程序、算法性能的检查或优化
这大致也是UNIX系统问世的时间。
该时间可存储于time_t类型的变量中。
在32位Linux系统中。time_t是一个有符号整数,能够表示的日期范围从1901年12月13日20时45分52秒至2038年1月19日03:14:07。因此,32位系统的机器都将面临2038年的问题。当然这我们不必操心。到了2038年,我相信这些系统早已升级为64位或者很多其它位的系统了。只是有些寿命更长的嵌入式设备,可能还会受到此问题的影响。
这些函数屏蔽了因时区、夏令时(DST)制和本地化等问题给转换所带来的种种复杂
#include <sys/time.h>
// Return 0 on success, or -1 on errorint gettimeofday (struct timeval* tv, struct timezone* tz);
tv所指向的结构体例如以下struct timeval {time_t tv_sec; /* Seconds since 00:00:00,
1 Jan 1970 UTC*/susecond_t tv_usec; /* Additional microseconds
(long int)*/};gettimeofday()函数提供到微秒级的精度并存储于tv_usec中,这种精度对大多数程序来说已经可以满足。在x86-64平台上,gettimeofday()不是系统调用,而是在用户态实现的,没有上下文切换和陷入内核的开销,因此其速度是比較快的[1]。
參数tz是一个历史产物,在早期的UNIX系统实现中使用其来获取系统的时区信息,眼下已被废弃。因此在调用时始终置为NULL。
#include <time.h>
// Returns number of seconds since the Epoch, or (time_t)-1 on errortime_t time (time_t* timep);
假设timep參数不为NULL,那么还会将自Epoch以来的的秒数置于timep所指向的位置中。可是在日常使用中我们都採用简单的调用方式t = time (NULL)。从函数说明上能够得知gettimeofday()的准确度要比time()要高。
#include <time.h>
// Returns pointer to statically allocated string terminated by newline and \0 on success,
or NULL on errorchar* ctime (const time_t* timep);
把一个指向time_t的指针作为timep參数传入函数,将返回一个长达26个字节的字符串,内含标准格式的日期和时间,例如以下:Wed May 14 15:22:34 2014该字符串包括换行符合终止空字节各一。ctime()函数在进行行转换时会自己主动对本地时区和DST设置加以考虑。返回的字符串经由静态分配的。因此无需调用free函数,正因如此。该函数是不可重入的(非线程安全的)。线程安全的版为ctime_r()。
struct tm {int tm_sec; /*Seconds
(0-60)*/int tm_min; /*Minites
(0-59)*/int tm_hour; /*Hours
(0-23)*/int tm_mday; /*Day
of the month (1-31)*/int tm_mon; /*Month
(1-12)*/int tm_year; /*Year
since 1900*/int tm_wday; /*Day
of the week (Sunday = 0)*/int tm_yday; /*Day
in the year (0-365; 1 Jan = 0)*/int tm_isdst; /*Daylight
saving time flag > 0: DST is in effect; = 0:
DST is not effect; < 0: DST information not available*/
};结构体tm将日期和时间分解成多个独立的字段,这样能方便程序获取不同的字段值来处理。字段tm_sec的上限为60而不是59。这种设计主要是考虑闰秒。偶尔用其将人类日历调整至精确的天文年(所谓的回归年)。假设程序中定义了_BSD_SOURCE測试宏,那么有glibc定义的tm结构还会包含两个字段,一个为long
int tm_gmtoff。用于表示时间超出UTC以东的秒数,一个为const char* tm_zone,用于表示时区的缩写(比如:CEST为欧洲中部夏令时间)。
gmtime()和localtime()两个函数可将time_t转换成struct tm。gmtime()直接将time_t分解成UTC时间的tm,localtime()须要考虑时区和夏令时的设置,详细声明例如以下:#include <time.h>
// Both return a pointer to a statically allocated broker-down time structure on success,
or NULL on errorstruct tm* gmtime (const time_t
*timep);struct tm* localtime (const time_t
*timep);以上两个函数都是非线程安全的,线程安全版本号为gmtime_r()和localtime_r()
mktime()函数能够将struct tm转换成time_t,其声明例如以下:#include <time.h>
// Returns seconds since the Epoch corresponding to timeptr on success, or (time_t)-1 on
errortime_t mktime (struct tm *timeptr);该函数可能会改动timeptr相应的值,至少会确保对tm_wday和tm_yday字段的设置,确保这些字段与其它字段可以相互相应起来。同一时候,mktime()在进行转换时会对时区进行设置。此外,DST设置的使用与否取决于输入字段tm_isdst的值。
- 若tm_isdst为0,则将这一时间视为标准时间(即,忽略夏令时)
- 若tm_isdst大于0,则将这一时间视为夏令时
- 若tm_isdst小于0,则试图判定DST在每年的这一时间是否生效。这往往是众望所归的设置
#include <time.h>
// Returns pointer to statically allocated string terminated by newline and \0 on success,
or NULL on errorchar* asctime (const struct tm
*timeptr);
与ctime()相比,本地时区的设置对asctime()没有影响。其返回的指针所指向的是由静态分配的字符串,因此其不是线程安全的,线程安全的版本号为asctime_r(),输出结果大概例如以下:
Wed May 14 16:43:21 CET 2014
asctime()函数返回的是一个固定形式的字符串。有时为了更易于理解,程序不想仅局限于这种字符串,于是Linux中提供了strftime()函数,声明例如以下:#include <time.h>
// Returns number of bytes placed in outstr (excluding terminating null bytes) on success,
or 0 on errorsize_t strftime (char *outstr, size_t maxsize, const
char *format, const struct tm *timeptr);
outstr中返回的字符串依照format參数定义的格式做了格式化,maxsize则是ourstr的最大长度,假设成功则将格式化后的内容写入outstr所指向的缓冲区中。然后返回字符串的真实长度。含终止空字节,假设真实长度超过了maxsize參数的大小,那么返回0以表示出错。且无法确定outstr的内容。參数format是一个字符串,类似于printf()參数。
具体值在此不做具体解释,能够google。
strptime()函数与strftime()函数正好相反。其能够将包括日期和时间的字符串转换成struct tm,声明例如以下:#define _XOPEN_SOURCE#include <time.h>
// Returns pointer to next unprocessed character in str on success, or NULL on errorchar* strptime (const char *str, const
char *format, struct tm *timeptr);
函数strptime()依照format參数内容对由日期和时间组成的字符串str加以解析,并将转换后的数值存储于timeptr所指的缓存中。假设成功。返回指向str中下一个还未解析过的字符。假设所给的str无法和format相相应。则会解析失败,返回NULL。以示错误。最后还需注意,strptime()函数不会设置tm中的tm_isdst字段。
时区文件格式记叙于tzfile(5)手冊页,其创建可通过zic(8)(时区信息编译器。zone information compiler)工具来完毕。zdump(8)命令可依据指定时区文件里的时区来显示当前时间
char *tzname[2]; /*Name
of timezone and alternate (DST) timezone*/int daylight; /*Nonzero
if there is an alternate (DST) timezone*/long timezone; /*Seconds
difference between UTC and local standard time*/
本文没有涉及到所讲述的函数用例,如有在程序中使用到这些函数,能够百度或者google,再者你能够查看https://github.com/ApusApp/Swift/tree/master/swift/base中关于时间处理的实现。
版权声明:本文博主原创文章,博客,未经同意不得转载。
每天进步一点点——Linux系统时间来处理的更多相关文章
- Linux_自动调整linux系统时间和时区与Internet时间同步
调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# v ...
- 修改linux系统时间的方法(date命令)
修改linux系统时间的方法(date命令) 来源:互联网 作者:佚名 时间:11-18 23:22:27 [大 中 小] date命令不仅可以显示系统当前时间,还可以用它来修改系统时间,下面简单的介 ...
- Linux系统时间的设置
1. Linux系统时间的设置 在Linux中设置系统时间,可以用date命令: //查看时间[root@node1 ~]# dateTue Feb 25 20:15:18 CST 2014//修改时 ...
- Linux系统时间同步方法小结
在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系.系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间,以保证时间的不 ...
- 一点点linux系统的学习心得
我相信你正在阅读本文的时候,可能是因为你渴望学习Linux技术.我想分享一下过去两年中我自己的一些学习经历,希望你能更顺利地成为Linuxer. 两年前在Linux系统的运行和维护方面找到了一份工作( ...
- 自动调整linux系统时间和时区与Internet时间同步
调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# v ...
- Linux学习之十-Linux系统时间
Linux系统时间 1.date命令用于查看以及修改Linux系统的时间,关于date命令的详细帮助文档如下 [root@localhost ~]# date --help Usage: date [ ...
- Linux的硬件时间、校正Linux系统时间及系统时间调用流程
第一部分: 一)概述: 事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间 UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时. ...
- linux 系统时间 硬件时间
Linux时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock,简称RTC).系统时钟是指当前Linux Kernel中的时钟:而硬件时钟则是主板上由电池供电的时钟, ...
随机推荐
- 常用的CSS属性
1.CSS背景属性(background) 属性 描述 background 在一个声明中设置所有的背景属性 background-attachment 设置背景图像是否固定或者随着页面的其余部分滚动 ...
- [ERROR] Unknown/unsupported storage engine: InnoDB
将CentOS上的mysql升级以后,出现无法启动服务的问题.运行mysqld_safe后查看log信息,看到标题所示的错误.搜索以后发现是配置不对,难道两个版本的配置不能互相兼容?那还叫升级?坑爹啊 ...
- dom方法读取xml(不常用)
Book.java package com.xml.demo; public class Book { private int id; private String name; private Flo ...
- 外国高手画神级的linux 内核图,够详细!
- oracle创建主键序列和在ibatis中应用
oracle创建主键序列 oracle主键序列的查询和ibitas中应用
- 《python基础教程》笔记之 抽象
创建函数 记录函数,在函数的开头写下字符串,它就会作为函数的一部分进行存储,这称为文档字符串,如 def square(x): 'Caculates the square of the number ...
- jQuery CSS3 照片墙
<html> <head> <style type="text/css"> .picture-wall-container{ position: ...
- HTML资源(推荐)
W3C在线验证工具:http://validator.w3.org/ (X)HTML嵌套规则:http://www.cnblogs.com/PeunZhang/archive/2012/03/11/2 ...
- d3可视化实战02:理解d3数据驱动的真正含义
前文中已经提到,SVG从诞生之初起就可以非常方便地使用javascript脚本语言来进行其DOM对象的控制.当然,控制的方法有很多,有直接控制SVG对象的方法,例如使用原生js:有帮你封装一下图形接口 ...
- OpenSSL初瞻及本系列的博文的缘由
OpenSSL初瞻及本系列的博文的缘由1.为什么要写关于“OpenSSL源码分析与学习笔记”系列博文?非常重要的两个原因是Heartbleed和学校课程.我虽然是一个非常崇尚自学的人但是并不代表我不擅 ...