首页 > 系统相关 >linux下时间时区详解

linux下时间时区详解

时间:2024-08-04 14:17:55浏览次数:9  
标签:tzset 调用 详解 时间 linux 时区 localtime

  首先我们要明白,“时间”和“时区”是两个东西。

  时间是指从某个时间点开始到另一个时间点经过的“长度”,是“纵向”距离,一般在linux系统内有两个主要的时间,一是始于1970年(unix元年)至今的距离,二是系统启动后至今的距离。前者一般是由不断电的硬件维护(RTC)或者其他专门服务器授时(NTP),可修改;后者只能前进无法后退,不能修改

  时区则是指世界范围内(国家/洲际之间)昼夜交替不同而导致的每天的相对时间不同造成的区域划分,是“横向”的“偏移”。比如北京会比纽约早12小时看到日出。时区一般以1小时划分,全球就有24个时区

 

  linux操作系统内核只有“时间”概念,没有“时区”概念。对于linux操作系统本身来说,启动后时间为0,表示当前就是1970年。我们通过读取RTC或NTP时间后,会通过系统调用更新这个时间,然后cpu会自动对时间进行累加。后面其他进程就可以获取正确的时间了。

  应用进程从系统内核读取到自1970年来经历过的时间后就会有一个问题,就是同样经过了一百年整,有些地区现处于旭日东升,另一些地区确黑夜蔽日。因此就要靠时区对这个时间进行一个“合理的描述”,比如在北京,现在就应该处于正午,日头正浓,而同样的时间点在纽约,大家就进入梦乡了。

  这样大家更加理解了时区概念,它并不存在,只是为了让全球在24小时的尺度内(由于地球自转)对于同样一个时间点发生的日照情况比较合理。

  

  接下来我们着重说说应用进程如何使用时间和时区。

  一般我们会将这个过程分为3步,第一步是从系统获取时间(1970年来秒数),第二步是从文件系统读取时区配置(对于现代操作系统,还可能是GPS定位或通过出口网络进行ISP运营商定位等)以获取偏移量(也即一个秒数,可能为负),第三步则是将两者相加并格式化输出。

  (这里还体现了我们程序编写中的一个数据和显示分离的思维,数据还是那个数据(1970年至今秒数),但展示是因人而异的)

  

   

  上面代码中的tzset十分重要,它一般会从环境变量或/etc/localtime文件中读取时区配置并设置到进程全局变量。然后localtime,strftime等函数则会参考全局变量来计算当前地区应该显示的时间。

  (tzset函数可以只调用一次,除非确定了配置更改,也可以不调用,因为strftime等函数内部有判定,如果进程对tzset函数调用次数为0,则会主动调用一次)

 

  我们具体讲讲linux下时间日期的格式化输出和其背后的运行逻辑。

  首先我们要认识一个前提:就是tzset为什么必须调用?

  其实道理很简单,因为c库没有自动运行的权利。它不会在你加载*c.so时就自动调用某个函数,甚至遑论读取文件系统的文件,这个操作具有一定的侵入性,也会造成一些不必要的浪费(万一你的程序不需要格式化时间日期呢)。

 

  我们根据一个实例来跟踪一下。

  我们一般在系统内查看当前时间是使用date命令,以下是一般用法。

  

  我们跟踪一下date命令的代码(以busybox为例)

  

  

  

  我们可以看到,其实重要的就是time/localtime/strftime几个函数。

  我们接着跟踪一下。

  

  

  可以发现,localtime调用了tzset_internal。而实际上,tzset也是调用的tzset_internal。

  

  tzset后,时区的偏移量就有了。后续就可以compute了

   

 

  综上所述,其实所谓的时区并不复杂,就是一个秒数偏移量,用于不同地域的格式化输出。

 

   我们再最后稍微深入分析一下tzset的内部实现。

  

  可以看到,tzset首先从环境变量/编译时宏定义/运行时系统文件等地方读取配置进行分析。

   

  当然,最终更新到的全局变量在外部也可访问

  

  从tzset代码也可以看出,一般我们配置时区还是以配置文件为主。配置文件一般在/etc/localtime。

  

  当然,这个配置文件是二进制的,并不容易编辑。

  

  如果只需要单独进程具有正确的时区,可以使用setenv("TZ", "CST-8", 1);tzset();来更新。

  setenv中还有一个坑,就是我们为什么设置的是CST-8(CST是什么意思我就不赘述了,大家百度一下即可,其实也没什么特别的意思,写ABC没区别,它只是你为当前地区取得别名),不是说中国在东8区吗,东为正,应该是+8啊!

  这里是一个思维误区,就是我们设置的是UTC时区,即是“计算出UTC零点的算法”。所以CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。

 

  最后修改时间 2024-08-04 14:13:54

 

标签:tzset,调用,详解,时间,linux,时区,localtime
From: https://www.cnblogs.com/Johness/p/18341712

相关文章

  • 【C++核心篇】—— C++面向对象编程:封装相关语法使用和注意事项详解(全网最详细!!!)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、封装(类)1.封装的使用(类和对象)2.对象的初始化和清理2.1构造函数2.2析构函数2.3构造函数的分类及调用3.深拷贝与浅拷贝4.C++对象模型和this指针5.友元6.运算符重载前言在本篇......
  • 黑苹果使用opencore引导开机时间很久
    使用-v模式发现引导时卡在dyld界面很久,整个开机时长达1分钟之久,如下图,但是系统又能够正常引导,不会重启之类的错误。opencore版本从0.8.8升到最新的1.0.0也不行,macos版本是ventura13.6。查询相应文章链接1发现是macos开机会执行磁盘TRIM导致开机时间久,通过修改Kernel>Q......
  • 【002】Linux配置静态ip地址
    一、环境虚拟机版本:VMwareLinux镜像文件:CentOS-7-x86_64-Minimal-2207-02.iso主机系统:Windows11家庭中文版主机系统类型:64位操作系统,基于x64的处理器远程连接工具:宝塔远程工具二、配置静态ip1、将虚拟机的网络模式设置为NAT模式2、设置VMware的网络模式选择VM......
  • mysql 慢查询 常时间 执行 问题排查
    1、metadatalock导致大量线程卡住  步骤1:showfullprocesslist命令查看线程状态 步骤2:performance_schema.events_statements_current中的未提交事务 步骤3:   查询正在执行的事务SELECT*FROMinformation_schema.innodb_trx; inn......
  • Java 文件 I/O流详解
    文件文件操作是Java开发中一个重要的组成部分,它允许开发者对文件进行读取,写入,创建,删除和修改等操作,文件操作的主要通过java.io包中的类来实现的,其中的File类更是文件操作的核心类File类的常用方法创建文件或目录文件创建使用createNewFile();可以创建一个新的空文......
  • 【leetcode详解】另一棵树的子树 (C++递归:思路精析&& 过程反思)
    思路详解:总体框架:对root树进行先序遍历,如果当前结点(记为cur)的值和subRoot的根节点值相等时,就开始判断 以cur为根节点的树和子树是否结构一样?如何判断两棵树是否结构完全相同?分析:一提到“树”结构,很容易想到在(先/中/后序)遍历上做文章,请教了AI后笔者得知,如果两棵树......
  • wkt格式文件详解(包含应用示例)
    还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。No.内容链接1Openlayers【入门教程】-......
  • Linux下安装OpenCV
    安装先安装依赖库:sudoapt-getinstallbuild-essentiallibgtk2.0-devlibgtk-3-devlibavcodec-devlibavformat-devlibjpeg-devlibswscale-devlibtiff5-dev根据官网教程进行安装:OpenCVGetStartedOperatingSystem:LinuxBuildingFromSource:YesLanguage:C++O......
  • 问题记录:解决Linux登录故障,/etc/passwd配置受损该怎么操作
    问题记录:解决Linux登录故障,/etc/passwd配置受损该怎么操作引言在维护Linux系统的过程中,可能会遇到各种紧急情况,其中/etc/passwd文件的损坏是运维人员特别需要准备应对的一种情形。该文件作为Linux用户账户信息的核心存储,一旦遭到破坏,会直接导致用户无法登录,甚至系统服务失......
  • Nexpose v6.6.263 for Linux & Windows - 漏洞扫描
    Nexposev6.6.263forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,releaseJul31,2024请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随时了解您的风险。......