Linux中的时间和时间管理

Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。

Epoch(新纪元)被定义为协调世界时(也成为UTC或格林尼治标准时间或者GMT)的1970年1月1日的午夜0:00。

Calendar time 是自Epoch以来所经过的秒数。

time_t (即long)

#ifndef _TIME_T_DEFINED

typedef long time_t; /* time value */

#define _TIME_T_DEFINED /* avoid multiple defines of time_t */

#endif

头文件::time.h

函数原型:time_t time(time_t *timer)

功能:获取当前系统时间

tm

#ifndef _TM_DEFINED
struct tm {
        int tm_sec;     /* 秒 – 取值区间为[0,59] */
        int tm_min;     /* 分 - 取值区间为[0,59] */
        int tm_hour;    /* 时 - 取值区间为[0,23] */
        int tm_mday;    /* 一个月中的日期 - 取值区间为[1,31] */
        int tm_mon;     /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
        int tm_year;    /* 年份,其值等于实际年份减去1900 */
        int tm_wday;    /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
        int tm_yday;    /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
        int tm_isdst;   /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
        };
#define _TM_DEFINED
#endif

struct tm *gmtime(const time_t *timep) // covert time_t to GMT

char *asctime(const struct tm *tm) // converts the broken-down time value tm into a string with the same format as ctime().

char *ctime(const time_t *timep)

struct tm *localtime(const time_t *timep)

我们可以通过asctime()函数和ctime()函数将时间以固定的格式显示出来,两者的返回值都是char*型的字符串。返回的时间格式为:
星期几 月份 日期 时:分:秒 年\n\0
例如:Wed Jan 02 02:03:55 1980\n\0

size_t

无符号整数的C / C + +类型,stddef.h头文件

经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。

自定义时间格式

size_t strftime(

char *strDest,

size_t maxsize,

const char *format,

const struct tm *timep

)

我们可以根据format指向字符串中格式命令把timep中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向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 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

#include <stdio.h>
#include <time.h>

void main( void )
{
        struct tm *newtime;
        char buf[128];
        time_t time;
        time( &time); // time=time(NULL);
        newtime=localtime(&time);
        strftime( buf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
        printf(buf);
}

运行结果:
Today is Saturday, day 30 of July in the year 2005.

#include <stdlib.h>

int system(const char *command);

计算时间差

NAME
       difftime - calculate time difference

SYNOPSIS
       #include <time.h>

double difftime(time_t time1, time_t time0);

单位为秒。

分解转化时间

time_t mktime(struct tm *tm);

Linux kernel time

kernel/include/linux/time.h

#ifndef _STRUCT_TIMESPEC
#define _STRUCT_TIMESPEC
struct timespec {
              __kernel_time_t tv_sec;   /* seconds */
              long  tv_nsec;  /* nanoseconds */
};
#endif

struct timeval {
             __kernel_time_t  tv_sec;  /* seconds */
             __kernel_suseconds_t tv_usec; /* microseconds */
};

source/arch/x86/include/asm/posix_types_32.h

typedef long __kernel_time_t;

typedef long __kernel_suseconds_t;

当系统启动时,内核通过读取RTC(实时时钟)来初始化实际的时间,该时间存放在xtime变量中。

xtime是内核中的全局变量:extern struct timespec xtime;

节拍率(tick rate):一秒内系统产生多少次时钟中断,内核中用HZ表示。

#define HZ 1000 // i386

节拍(tick):两次时钟中断的间隔时间。

全局变量jiffies用来记录自系统启动以来产生的节拍的总数。定义于<linux/jiffies.h>

extern unsigned long volatile jiffies;

volatile指示编译器每次访问变量时都从主内存中获得,而不是通过寄存器中的变量别名来访问。

系统自启动以来的运行时间=jiffies/HZ,单位为秒。

内核代码

asmlinkage long sys_time(time_t __user *tloc);
asmlinkage long sys_stime(time_t __user *tptr);
asmlinkage long sys_gettimeofday(struct timeval __user *tv,
    struct timezone __user *tz);
asmlinkage long sys_settimeofday(struct timeval __user *tv,
    struct timezone __user *tz);

在source/include/linux/types.h中,有众多内核类型的定义。

typedef int  __kernel_ timer_t;

typedef __kernel_timer_t timer_t;

参考:http://www.cnblogs.com/Wiseman/archive/2005/10/24/260576.html (有例子)

时间: 2024-11-01 11:03:48

Linux中的时间和时间管理的相关文章

Linux中的账号和权限管理(理论讲解部分)

小伙伴们本次给大家带来的是Linux中的账号和权限管理,这里我们首先要明确的就是这个权限是文件或者目录的权限.接下来我们会从以下几个部分进行了解: 用户账号和组账号概述 用户账号和组账号管理 查询账号信息 查看目录或文件的属性 设置目录或文件的权限 设置目录或文件的归属 用户账号和组账号概述Linux基于用户身份对资源访问进行控制1.用户账号:? 超级用户? 普通用户? 匿名用户(everyone)? 程序用户(人为不可使用,单独管理系统中某个应用程序存在的服务)2.组账号:组是系统用户权限的集

linux中用户和组的管理

一.用户的帐号管理   ①添加帐号:useradd 选项: -c, --comment 'COMMENT':在创建用户时为用户添加注释信息,一般为全名. -d, --home/PATH/TO/HOME_DIR:在创建用户的时候为用户指定家目录的绝对路径,被指定的目录应该是事先不存在的目录: -g, --gid GROUPNAME:在创建用户时,为用户指定主组: -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:在创建用户时,为用户添加附加组: -m, --cr

Linux中的用户和权限管理

Linux是多用户,多任务操作系统:多用户是指多个用户可以同时使用系统资源,而多任务指同时运行多个进程. 用户是能够获取系统资源的权限的集合,Linux通过用户实现资源分隔. 用户组是具有相同特征用户的逻辑集合,是用户的容器. 1.用户: (1)用户类别 管理员:root 普通用户: 系统用户:仅仅用于用于启动服务进程. 登录用户:用于使用者交互使用,是系统资源的使用者 (2)用户在操作系统中用UID来标识: UID是16bits的二进制数字,如此范围为:0-65535.Linux 系统对用户U

Linux中组 与 用户的管理

在linux中建立组的指令是 groupadd 组名 相应的,删除组的指令: groupdel 组名 查看自己用户的组: groups 用户管理: useradd -s/bin/bash -g 组名 用户名 -s表示用户登陆后打开的终端, 这里是/bin/bash,如果想禁止登陆,可设置为/sbin/nologin -M 不建立用户的主文件夹,用户登陆会跑到 / 去.可手工建立,如果是禁止登陆,建议加这个参数 既然有useradd指令,当然有对应的userdel... users是用来查看当前有

linux中安装程序及账号管理

程序安装及管理 Linux 应用程序基础Linux命令与应用程序的关系1):文件位置系统命令:一般在/bin和/sbin目录中,或为Shell内部指令应用程序:通常在/usr/bin和/usr/sbin目录中2):主要用途系统命令:完成对系统的基本管理工作,例如IP配置工具应用程序:完成相对独立的其他辅助任务,例如网页浏览器3):适用环境系统命令:一般只在字符操作界面中运行应用程序:根据实际需要,有些程序可在图形界面中运行4):运行格式系统命令:一般包括命令字.命令选项和命令参数应用程序:通常没

linux中用户和用户组的管理

一.安全上下文 Linux中,能够实现资源使用和完成任务的主体是应用程序进程,进程是以发起者的身份运行的,每个进程的拥有者就是它的发起者,进程会被标记上发起者的身份信息用于验证权限.当进程试图访问资源的时候,安全上下文(Secure Context)会比对进程的所有者和资源的所有者之间的关系. 首先,查看进程的所有者是否和资源所有者为同一用户,若是,则按照所有者拥有的权限来使用资源: 如果不是,则判断进程的所有者是否属于该资源所属组的成员,若是,则按照所属组的权限来使用资源: 如果不是,就按照最

Linux 中的用户组与权限管理

Linux中的用户以令牌token,identity为标识符号,每一个用户都拥有一个 Username和UID,root用户比较特殊,他的的UID为0.普通用户的UID由系统在1-60000范围内自动分配,系统用户的UID默认取值范围为1-499,Centos7之后范围扩大至1-999,登录用户的UID取值范围为500-60000,Centos7后调整为1 000-60000. 拥有相同权限的用户可以组成一个组,用户必须属于一个且只有一个主组,且组名同用户名,且仅包含一个用户.一个用户可以属于零

Linux 中的MYSQL数据库常用管理语言

Linux 中的MYSQL数据库管理语言1 登录数据库mysql -u (用户) -p输入密码 2 查看数据库 show databases ;3 使用数据库 use 库名 :4 查看库中的表 show tables :5 查看表的结构 describe 表名 :6 创建和删除数据库Create database 库名 :Drop database 库名 :7 创建表Create table 表名 (字段1 类型,字段2 类型,- ,primary key (主键名)):8 删除表Drop ta

linux中显示/设置系统时间

date   显示/设置 系统时间 +某个格式 以某种格式显示日期 格式: +%F  2017-08-20  ====== +%Y-%m-%d +%w 显示周几  0 周日  1-6 周一到周六 +%T  时:分:秒     ====== +%H:%M:%S -d  按照你的描述显示日期 -d "1day"    1天之后  ==== +1day -d "-1day"   1天之前 -s修改系统的时间 1.1 修改系统时间的命令 ntpdatepool.ntp.or

linux中的三种时间

mtime [修改时间] 文件/目录的修改时间 ctime  [属性修改时间] 文件目录的属性的修改时间 atime  [访问时间]文件/目录的访问时间 stat 123.txt   File: `123.txt'   Size: 0         Blocks: 0          IO Block: 4096   regular empty file Device: 803h/2051d   Inode: 2581        Links: 1 Access: (0644/-rw-r-