时间日期与时间戳转换(Linux C)

2024-09-08 05:08
文章标签 linux 时间 转换 日期

本文主要是介绍时间日期与时间戳转换(Linux C),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要学习三个知识点,第一是UTC时间、GMT时间的概念;第二是在Unix环境下UTC时间与时间戳的转换;第三是在C语言中如何修改时区。
本文参考了《UNP》以及
http://blog.csdn.net/foxir/article/details/43916601
http://blog.csdn.net/ljafl9988/article/details/16847935

一、时间与日期

GMT和UTC

GMT,即格林尼治标准时间,也就是世界时。GMT的正午是指当太阳横穿格林尼治子午线(本初子午线)时的时间。但由于地球自转不均匀不规则,导致GMT不精确,现在已经不再作为世界标准时间使用。

UTC,即协调世界时。UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统。为确保UTC与GMT相差不会超过0.9秒,在有需要的情况下会在UTC内加上正或负闰秒。UTC现在作为世界标准时间使用。

所以,UTC与GMT基本上等同,误差不超过0.9秒。

时区

地球自西向东旋转,东边比西边先看到太阳,东边的时间也比西边的早。为了统一世界的时间,1884年的国际经度会议规规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为零时区(GMT+00),东1-12区,西1-12区,中国北京处于东8区(GMT+08)。

若中国当前时间为8点整,则英国时间为0点整。

UNIX时间戳

由Unix内核提供的基本时间服务是自国际标准时间公元1970年1月1日00:00:00以来的秒数。

二、时间字符串相互转换

时间戳转换为格式化日期

流程: time_t(日历时间) ——->struct tm(以年月日、时分秒表示的时间)——>格式化字符串(利用strftime函数)

#include <stdio.h>  
#include <time.h>  int main(int argc, const char * argv[])  
{  time_t t;  struct tm *p;  t=0;  p=gmtime(&t);  char s[100];  strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", p);  printf("%d: %s\n", (int)t, s);  return 0;  
}  

结果:
1970-01-01 00:00:00

格式化日期转换为时间戳

流程: struct tm(以年月日、时分秒表示的时间) —> time_t(日历时间)

#include <stdio.h>  
#include <time.h>  
#include <stdlib.h>    
int main(int argc, const char * argv[])  
{  struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));  strptime("19700101080000","%Y%m%d%H%M%S",tmp_time); //时间24时制time_t t = mktime(tmp_time);  printf("%ld\n",t);  free(tmp_time);  return 0;  
}  

结果:
0

这里并没有把时间设置为1970年1月1日0点,因为这里涉及到时区的问题。我们目前处于东八区,计算时需要减去8小时。

三、环境变量TZ及时区设置函数

在UNP书里讲过,时间函数除了gmttime()、asctime()不受环境变量TZ的影响外,大部分函数都受到环境变量TZ的影响,这几个函数是: localtime、mktime、ctime和strftime。如果定义了TZ,则这些函数将使用其值以代替系统默认时区。

在Unix环境下可以通过改变系统文件修改环境变量,也可以通过函数setenv()修改。

TZ指定了当前的系统时区。这个时区会影响我们所做的时间转换。例如假设当前的系统时间是8:00AM,如果我们把当前的时区设置成东八区,则标准时间就是(即GMT+0)的时间就是8-8=0:00AM,如果是看成是东6区的话,则标准时间就变成了8-6=2:00AM。

时区设置函数是: setenv(“TZ”, “GMT+0”, 1);//将当前时区设置成标准区
setenv(“TZ”, “GMT-8”, 1); 表示的意思就是:将当前时区设置成东八区。需要注意的是,这里要写成GMT-8才是东八区,不是GMT+8,原因GMT表示时间的方式有点不同,它的格式是(GMT[+/-]offset), 如果目标时区是在东区,则是负的,否则是正的。意思就是本地时区加减多少(offset)才能得到标准时间。

代码:

#include <stdio.h>  
#include <time.h>  
#include <stdlib.h>    
int main(int argc, const char * argv[])  
{  setenv("TZ", "GMT-8", 1);//时区设置为东8区//setenv("TZ", "GMT+0", 1);//将当前时区设置成标准区struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));  strptime("19700101080000","%Y%m%d%H%M%S",tmp_time); //时间24时制time_t t = mktime(tmp_time);  printf("%ld\n",t);  free(tmp_time);  return 0;  
}  

当时区设置为东8区时,我们标准时间为8-8=0小时,转换为秒数为:0
当时区设置为国际标准时,标准时间即为8-0=8小时,转换为秒数为:(8-0)*3600=28800

这篇关于时间日期与时间戳转换(Linux C)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147198

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at