linux 时间转换

引言 :今天写code 遇到一个 时间转换的 突然对转换函数不太确定 翻开之前的记录 看了一下 然后顺便发到这里来

一:数据结构

linux下存储时间常见的有两种存储方式,一个绝对秒数,一个是用一个结构来分别存储年月日时分秒的

头文件 #include <time.h>

typedef long  time_t;   // 其实time_t 就是long 类型  长整型     time函数可以获取从1970年到现在经过了多少

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()为负。*/

long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/

const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/

};

二:函数(归类记忆)

返回秒数 区别在于mktime 可以返回顺便 tm结构的

1:time()         函数返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数

2:time_t mktime(struct tm * timeptr);  将时间转换为自1970年1月1日以来持续时间的秒数

返回字符串 区别在于传入参数不一样

3:char *asctime(const struct tm* timeptr);      将结构中的信息转换为真实世界的时间,以字符串的形式显示

4:char *ctime(const time_t *timep);  将timep转换为真是世界的时间,以字符串显示

返回tm结构 区别在于 localtime 返回当前时区

5:struct tm* gmtime(const time_t *timep);    将time_t表示的时间转换为没有经过时区转换的UTC时间(0时区)

6:struct tm* localtime(const time_t *timep);  和gmtime类似,但是它是经过时区转换的时间 返回当前时区

PS:  UTC (世界协调时间) 相当于本初子午线(即经度0度)上的平均太阳时称0时区

GMT (格林威治)         跟UTC一样 北京在东八区,北京时间领先于utc八个小时

DST (夏日节约时间)我见的比较少  度娘了一下 是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使 用,

在英国则称为夏 令 时间(Summer Time),也可能就是为什么美国波士顿夏天时候跟中国相差12小时 冬天相差13

CST(中部标准时间) 重点说一下这个  一般来说 我们在linux 下 用date 命令 显示的都是 cst 格式的

其实 cst 不单单代表中国时间  其实 代表了 美国 澳大利亚  古巴 中国 4个市区时间

CST Central Standard Time (USA) UT-6:00

CST Central Standard Time (Australia) UT+9:30

CST China Standard Time UT+8:00

CST Cuba Standard Time UT-4:00

linux下是通过/etc/localtime这个硬连接指向的/usr/share/zoneinfo下的时区文件表示当前的真正时区

例如/etc/localtime指向了/usr/share/zoneinfo/Asia/Shanghai这个文件的时候,CST就代表了中国标准时间。

cp 命令copy也是可以 例如

[[email protected] ~]# cp /usr/share/zoneinf/Asia/Shanghai  /etc/localtime  //复制相应的时区文件

[[email protected] ~]# hwclock //写入BIOS,避免重启失效

三:举例

1:显示当前时间  常见的格式 Fri Jan 11 17:25:24 2014

 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 int main()
 {
       time_t timep;
       time(&timep); /*获取time_t类型的当前时间*/
       printf("%s", asctime(gmtime(&timep)));/*用gmtime将time_t类型的时间转换为struct tm类型的时间按,*/
       printf("%s", ctime(&timep));//这个比较对 因为转了时区跟date 比较一致
       return 0;
  }

2: 绝对秒数转相应格式  time_t 秒数结构---->localtime  tm结构 ------>asctime 转成字符串

time_t 秒数结构---->localtime  tm结构 ------>strftime 转格式

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    time_t timep;
    struct tm *test = NULL;
    char tm[100];
    timep = 1378742400;
    printf("%s\n",asctime(localtime(&time));//转 字符串格式
    struct tm *tmtest = NULL;
    test = localtime(&timep);
    if(strftime(tm, sizeof(tm), "%Y-%m-&d %H:%M:%S",test))
       return -1;
    printf("%s\n", tm);
    return 0;
}
     

3:字符串转绝对秒数  最后都是用到mktime转为绝对秒数  代码不举例了

时间: 2024-08-02 04:13:40

linux 时间转换的相关文章

php将标准字符串格式时间转换成unix时间戳_strtotime

php 将标准字符串格式时间转换成unix时间戳的函数为:strtotime函数(PHP 4, PHP 5). strtotime函数详细参考: strtotime - 将任何英文文本的日期时间描述解析为 Unix 时间戳. 函数格式说明: int strtotime ( string $time [, int $now ] ) 本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数),其值相对于 n

Linux时间管理涉及数据结构和传统低分辨率时钟的实现

上篇文章大致描述了Linux时间管理的基本情况,看了一些大牛们的博客感觉自己写的内容很匮乏,但是没办法,只能通过这种方式提升自己--闲话不说,本节介绍下时间管理下重要的数据结构 设备相关数据结构 //时钟源结构 struct clocksource{} //时钟设备结构 struct tick_device { struct clock_event_device *evtdev; enum tick_device_mode mode;//记录对应时钟事件设备的模式 }; enum tick_de

Linux时间类型、函数和休眠函数

        转载请注明出处: http://blog.csdn.net/luotuo44/article/details/39374759 本文主要涉及Linux时间类型.时间函数以及Linux提供的睡眠函数. 时间类型和对应的函数: time_t: 最不陌生的时间类型恐怕是time_t这个类型了吧.它出现在C语言的标准库.但ISO C中并没有规定time_t是什么类型.范围以及精度,不过在POSIX中一般是被实现为有符号的整型. time_t的单位是秒.函数time()的返回值就是一个ti

Linux时间结构体和获得时间函数

关于Linux下时间编程的问题: 1. Linux下与时间有关的结构体 struct timeval { int tv_sec; int tv_usec; }; 其中tv_sec是由凌晨开始算起的秒数,tv_usec则是微秒(10E-6 second). struct timezone { int tv_minuteswest; int tv_dsttime; }; tv_minuteswest是格林威治时间往西方的时差,tv_dsttime则是时间的修正方式. struct timespec

Linux时间子系统(三) 用户空间接口函数

一.前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: 1.和系统时间相关的服务.例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时). 2.让进程睡眠一段时间 3.和timer相关的服务.在一段指定的时间过去后,kernel要alert用户进程 本文主要描述和时间子系统相关的用户空间接口函数知识. 二.和系统时间相关的服务 1.秒级别的时间函数:time和stime time和stime函数的定义如下: #include <time.h> time_t ti

Linux时间子系统(十五) clocksource

一.前言 和洋葱一样,软件也是有层次的,内核往往需要对形形色色的某类型的驱动进行抽象,屏蔽掉其具体的特质,获取该类驱动共同的逻辑,而又根据这些逻辑撰写该类驱动的抽象层.嵌入式系统总是会提供timer的硬件block,软件需要对timer硬件提供的功能进行抽象:linux kernel将timer类型的硬件抽象成两个组件,一是free running的counter,另外一个是指定的counter值上产生中断的能力.本文主要描述第一个组件,在内核中被称作clock source. 二.什么是clo

c#时间转换

转自 http://blog.csdn.net/yysyangyangyangshan/article/details/6782874 最近做ASP.NET的一个项目,获取时间的时候,由于我的系统时间设置了上午和下午,结果DateTime.Now老是写不到数据库中,然后,上网查了个 [csharp] view plaincopyprint? DateTime date = DateTime.Now; string dateStr= date.ToString("yyyy-MM-dd HH:mm:

Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)

在前面章节的讨论中,我们一直基于一个假设:Linux中的时钟事件都是由一个周期时钟提供,不管系统中的clock_event_device是工作于周期触发模式,还是工作于单触发模式,也不管定时器系统是工作于低分辨率模式,还是高精度模式,内核都竭尽所能,用不同的方式提供周期时钟,以产生定期的tick事件,tick事件或者用于全局的时间管理(jiffies和时间的更新),或者用于本地cpu的进程统计.时间轮定时器框架等等.周期性时钟虽然简单有效,但是也带来了一些缺点,尤其在系统的功耗上,因为就算系统目

Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时器的出现创造了条件.内核从2.6.16开始加入了高精度定时器架构.在实现方式上,内核的高分辨率定时器的实现代码几乎没有借用低分辨率定时器的数据结构和代码,内核文档给出的解释主要有以下几点: 低分辨率定时器的代码和jiffies的关系太过紧密,并且默认按32位进行设计,并且它的代码已经经过长时间的优化