linux应用time和timezone
linux中应用层(非内核层)time是怎样处理的?时区是怎样设置的?夏令时时是怎样实现的?NTP时间同步是怎么回事?本篇文章就在嵌入式linux应用中time和timezone相关问题总结。
1. NTP
经常说时间同步,同步就是为了获取统一的时间参考点。同步的时间来自授时中心,如ntp.pool.org。那NTP同步的时间是什么时间,包含时区吗?
NTP同步的时间是UTC-0时间,所有授时中心的时间都是UTC-0时间。NTP遵循NTPv4协议,通过时间偏差来调整本地基准(或参考时间,由time()或gettimeofday()获取)。
2. time
linux应用中的基准时间是?
通过man7 time可知UNIX systems represent time in seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC)。
A program can determine the calendar time using gettimeofday(2), which returns time (in seconds and microseconds) that have elapsed since the Epoch;
time(2) provides similar information, but only with accuracy to the nearest second.
When interpreted as an absolute time value, it represents the number of seconds elapsed since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).
time()或gettimeofday()返回的时间是日历时间,也是绝对时间,是unix系统应用基准时间。该时间表示自Epoch, 1970-01-01 00:00:00 +0000 (UTC)过去的秒数(或微妙数),与时区无关。
所有系统在同一时间调用time()返回值都一样(除去误差),不管在什么时区,是否采用夏令时。
time()返回time_t,是绝对秒数。
gettimeofday()返回struct timeval,包含tv_sec绝对秒数,tv_usec绝对微妙数。 两个函数均是系统调用。
3. timezone
时区设置由libc库函数tzset()实现,其读取并解析文件/etc/TZ或环境变量TZ,将时区、是否采用夏令时保存到静态变量中,供localtime_r()转换本地时间时调用。
void tzset (void);
extern char *tzname[2];
extern long timezone;
extern int daylight;
这些都是库函数,包含在头文件time.h中。
4. broken-down time分解时间
broken-down time由struct tm存储,包含年月日周天时分秒。最典型由localtime()函数获取,其为本地化时间(已转换为系统时区时间,并由变量tm_isdst指定是否支持夏令时)。
localtime_r()是libc库函数,调用time()将其返回的时间转换为本地时间,其转换包含时区信息。
5. 字符串时间
虽然localtime()包含可识别的时间,但不便于打印,需要转换为字符串。
strftime()按指定格式打印时间,asctime()按标准格式打印时间。
6. date
date显示的是本地时间(包含时区信息),底层实现调用localtime_r()(busybox实现)。也就是说date将绝对时间显示为本地时间,其根据时区调整显示时间。这样,上层应用(如时区更换)时换算更简单(都以绝对时间为参考)。
根据以上分析,无论时区是否改变,是否采用夏令时,日历时间(或绝对时间)都不会改变。当设置的时区中包含夏令时时间段时,当夏令时时间切换时,上层应用调用localtime_r()自动将时间切换为夏令时时间。
附:时间转换经典配图
附:时间相关概念,转自linux编程中与时间相关的问题总结
GMT:Greenwich Mean Time,格林尼治平均时。格林尼治标准时间是19世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。
UTC:Universal Time Coordinated,环球通用协调时间。基本上UTC的本质强调的是比GMT更为精确的世界时间标准,在不需要精确到秒的情况通常也将GMT和UTC视作等同。
DST:Daylight Saving Time,指在夏天太阳升起的比较早时,将时钟拨快一小时以提早日光的使用;
CST:CST可以同时表示美国UT-6:00,澳大利亚UT+9:30,中国UT+8:00,古巴UT-4:00四个国家的标准时间;
Epoch:时间轴上特定的一个时间点,定义为从格林威治时间1970年01月01日00时00分00秒。记为1970年1月1日00:00:00 UTC。
UNIX时间戳:英文表示为Unix timestamp、Unix time或者POSIX time。是从Epoch开始所经过的秒数,不考虑闰秒。在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。
Calendar Time:表示的意义同UNIX时间戳。
Broken-down Time:使用tm结构存储的时间,tm 数据结构将时间分别保存到代表年,月,日,时,分,秒等不同的变量中,不再是一个令人费解的64位整数。tm数据结构是各种自定义格式转换函数所需要的输入形式。
Real-Time:也称wall-clock,即我们人类自然感受的时间。
Virtual-Time:进程执行所占用的cpu时间(即站在进程的角度看时间),如果在过去的一秒钟指定进程没有被调用,则virtual time为0s,real time为1s。
Prof-Time:系统在用户态和内核态所占用cpu时间的总和;
clock tick:时钟滴答,当PIT通道0的计数器减到0值时,它就在IRQ0上产生一次时钟中断,即一次时钟滴答。
jiffies:记录着从电脑开机到现在总共的”时钟中断”的次数。启动时内核将该变量初始化为0,此后每次时钟中断处理程序都会增加该变量的值。jiffies类型为无符号长整型(unsigned long),其他任何类型存放它都不正确。
xtime:从cmos电路或rtc芯片中取得的时间,一般是从某一历史时刻开始到现在的时间;
参考:
3. time函数
5. NTP协议
linux应用time和timezone的更多相关文章
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- time函数
time函数 time #include<time.h> time_t time(time_t *t); typdef long int time_t; time() returns th ...
- HowTo: Linux Server Change OR Setup The Timezone
Method 1 #tzselect # select timezone e.g. Asia/Shanghai#echo 'Asia/Shanghai' > /etc/timezone # se ...
- Set Time, Date Timezone in Linux from Command Line or Gnome | Use ntp
https://www.garron.me/en/linux/set-time-date-timezone-ntp-linux-shell-gnome-command-line.html Set ti ...
- Linux/CentOS 7 timezone 修改
1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...
- linux timezone
首先需要了解下“UTC时间”与“本地时间”UTC时间:世界协调时间(又称世界标准时间.世界统一时间),在一般精度要求下,它与GMT(Greenwich Mean Time,格林威治标准时间)是一样的, ...
- linux 6 timezone修改
linux 6 / Amazon linux 因为正好在使用Amazon 的linux AMI 又遇到了需要修改系统时区这个case 所以就调查了一下修改方法,因为Amazon的linux版本是由A ...
- Linux学习
Linux 命令英文全称su:Swith user 切换用户,切换到root用户cat: Concatenate 串联uname: Unix name 系统名称df: Disk free 空余硬盘du ...
- Linux下Session丢失原因
最近碰到一个问题,把代码迁移到linux系统下,重新搭建php环境,运行代码, 在登录页面时,不能访问后台,会返回到登录页面,对代码测试,没有报任何错误, 最后检查到是跳转时,session丢失的问题 ...
随机推荐
- Spark Streaming源码解读之流数据不断接收和全生命周期彻底研究和思考
本节的主要内容: 一.数据接受架构和设计模式 二.接受数据的源码解读 Spark Streaming不断持续的接收数据,具有Receiver的Spark 应用程序的考虑. Receiver和Drive ...
- 关于configure和Makefile
http://blog.csdn.net/lltaoyy/article/details/7615833 转篇文章,讲的不是很清楚,再附上几个资料连接,来自http://www.linuxdw.com ...
- iOS 8 Share Extension Safari URL Example(在iOS中分享url的样例)
ios8 的Extension给我们提供了非常多奇妙的功能.以后分享内容再也不用进入app了,让我们的手机更安全,以下我们以在safari 浏览器中分享一个web url 来讲述Share Exten ...
- 运行时权限请求框架easypermissions
前言 之前使用过AndPermission权限申请库,当开发者执行有权限的代码发生异常时,AndPermission会抓到异常并回调到失败中,这里要注意的是会抓到任何异常,不仅仅是没有权限时的异常. ...
- shell中$0,$?,$!等的特殊使用方法
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后执行的后台Process的PID $? 最后执行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...
- 【服务器时间修改为东八区】包括Apache2和mysql
1.服务器Apache时间修改,可通过修改php.ini进行修改 所以就深入了解了一下, 发现Apache(PHP)的服务器时间时区默认为UTC(Coordinated UniversalTime 世 ...
- SSH面试题目
一简答 spring工作原理 为什么要用spring 3.请你谈谈SSH整合 4.介绍一下Spring的事务管理 5.Struct2基本流程 6.在Hibernate应用中Java对象的状态有哪些? ...
- NE2018届校招内推笔试——数据挖掘
[单选题|2分/题] 1.在只有两类的情况下,二维特征向量通过共享相同的协方差矩阵的正态分布生成,其中协方差矩阵为: 均值向量分别为:,则根据贝叶斯分类,样本分类为:() A. 分类2 B. 无法确定 ...
- canvas学习笔记(下篇) -- canvas入门教程--保存状态/变形/旋转/缩放/矩阵变换/综合案例(星空/时钟/小球)
[下篇] -- 建议学习时间4小时 课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...
- js根据对象的某一属性进行排序
function compare(property) { return function (a, b) { var value1 = new Date(a[property]); var value2 ...