linux时间结构体定义:

struct tm
{
     int    tm_sec; //代表目前秒数,正常范围为0-59,但允许至61秒
     int    tm_min; // 代表目前分数,范围0-59
     int    tm_hour; //从午夜算起的时数,范围为0-23
     int    tm_mday; //目前月份的日数,范围01-31
     int    tm_mon; // 代表目前月份,从一月算起,范围从0-11
     int    tm_year; //从1900年算起至今的年数
     int    tm_wday; //一星期的日数,从星期一算起,范围为0-6
     int    tm_yday; //从今年1月1日算起至今的天数,范围为0-365
     int    tm_isdst; //日光节约时间的旗标

};

1、time(获取当前UTC秒数,需要注意的该函数无时区转换)

#include<time.h>

time_t time(time_t *t);

这个函数应该算是最常用函数之一,返回UTC标准秒数,没有时区转换,在伦敦和上海同时调用这个函数返回值相同。

2、gmtime(获取当前时间结构,UTC时间,需要注意的是该函数无时区转换)

#include<time.h>
struct tm *gmtime(const time_t *timep);

struct   tm *gmtime_r(const time_t *timep, struct tm *result);

这两个函数意思一样,将timep这个秒数转换成以UTC时区为标准的年月日时分秒时间。
gmtime_r是线程安全的,推荐使用这个。gmtime返回的是一个struct  tm*,
这个指针指向一个静态的内存,这块区域是会经常被改动的。你刚调用gmtime(),
执行了其他几条命令,然后想使用刚才gmtime()得到struct  tm,会发现内容不对了,
所以很危险,使用gmtime_r后就没有问题,gmtime_r会将结果保存到你传入的内存中。

获得的struct tm结构体,注意该结构体的定义,如果要打印年份要+1900,月份+1.

3、localtime(获取当前时间结构,本地时间,但是有时区转换)

#include<time.h>

struct tm *localtime(const time_t * timep);

struct tm *localtime_r(const time_t *timep, struct tm *result);

这两个函数意思也一样,会根据时区信息得到本地时间,同样建议使用localtime_r版本。

4、mktime(将时间结构转换为UTC秒数,但是有时区转换)

#include<time.h>
time_t mktime(struct tm *tm);

将已经根据时区信息计算好的struct  tm转换成time_t的秒数。计算出的秒数是以UTC时间为标准的,跟调用time()得到的秒数是同一个概念。

回到文章的题目,为什么说负负得正呢,
比如utc时间秒数1519741060,当我用

gmtime_r

转换为struct   tm t结构时,再用mktime函数转换为秒数时,发现时间被减了8个小时,也就是8时区,这是因为mktime认为你的结构带了时区。

因此,如果想用秒数转换为tm结构之后,再从tm结构转换秒数的正确方法应该是使用localtime_r转为有时区的tm,mktime再去掉时区得回之前的秒数。这就是负负得正。

Linux使用带时区转换的时间函数注意事项(负负得正)相关推荐

  1. Go 学习笔记(48)— Go 标准库之 time (获取时/分/秒的单位值、标准时间和Unix时间转换、字符串时间和Time类型转换、时区转换、时间的加减/休眠)

    1. 概要说明 import "time" time 包提供了时间的显示和测量用的函数.日历的计算采用的是公历. Go 提供以下几种时间类型: 时间点 Time 时间段 Durat ...

  2. 东八区转为0时区_Java时区转换及时间格式

    本文介绍Java API 中 Date, Calendar, TimeZone和DateFormat的使用,以及不同时区时间相互转化的方法和原理. 问题描述: 向处于不同时区的服务器发请求时需要考虑时 ...

  3. mysql地区时间_mysql – 带时区的日期时间格式

    首先,阅读DATETIME和TIMESTAMP类型in the mysql docs. 然后,决定使用哪种字段类型: >如果要在不进行MySQL执行时区转换的情况下提交,存储和检索相同的值,请使 ...

  4. postgre 年月日转年月_关于datetime:带时区的PostgreSQL日期函数date()

    我在从Postgres正确选择日期时遇到了一个问题-这些日期存储在UTC中,但是未正确使用date()函数进行转换. 如果时间戳超过太平洋标准时间下午4点,那么将时间戳转换为日期会给出错误的日期. 在 ...

  5. linux自带图片转换命令,Linux 命令行处理图片(图片格式转换、缩放、旋转等)...

    命令可以在"开始→运行"的文本框中,也可以事先在bat批处理文档中编写好命令.未带任何参数是注册dll文件功能,其它参数对应功能如下:.linux提供了tee命令用于完成上述程序的 ...

  6. 时区转换,时间格式转换

    基本概念 UT - 世界时 TAI - 国际原子时 GMT - 格林尼治标准时间/格林威治平均时间 UTC - 协调世界时 LT - 本地时间 这篇文章解释的都很详细 一些时间的概念与区分(UTC.G ...

  7. 使用pytz模块进行时区转换及时间计算

    前言 最近遇到了一个问题:我的server和client不是在一个时区,server时区是EDT,即美国东部时区,client,就是我自己的电脑,时区是中国标准时区,东八区.我需要向server发送一 ...

  8. 带时区的日期时间国际标准

    ZonedDateTime类可以满足我们的需求. 其中每个时区都对应着 ID,地区ID都为 "{区域}/{城市}"的格式 例如 :Asia/Shanghai 等 now():使用系 ...

  9. linux less 带颜色,less中color函数字体颜色计算

    LESS 提供了一系列的颜色运算函数. 颜色会先被转化成 HSL 色彩空间, 然后在通道级别操作: lighten(@color, 10%); // return a color which is 1 ...

最新文章

  1. XP快速启动栏里的显示桌面没有了,其他的都还在,应该怎么再添加进去?
  2. Java访问指示符 访问修饰符
  3. Python解释器种类以及特点?
  4. (53)zabbix模板
  5. P4111 [HEOI2015]小Z的房间
  6. mcafee安装是出现1920错误
  7. MySQL step by step 安装实战
  8. Jenkins构建步骤图解
  9. Java中的可变参数使用
  10. 解决办法:look up error: undefined symbol
  11. matlab 光谱共聚焦,激光共焦显微拉曼光谱分析实验数据处理及谱图解析
  12. python图灵机器人接口_apikey创建接入图灵机器人
  13. Sharpen 的调试步骤
  14. Android下的蓝牙自动配对
  15. @Autowired和@Resource区别
  16. wxPython中文教程入门实例
  17. 03--SSM的知识与应用之Spring
  18. 保密相册计算机,‎加密相册(新版) - 密码计算机照片保险箱 im App Store
  19. nsi学习之 重复安装给于提示覆盖 不可以重复安装
  20. 【笔记】损失函数计算后返回 nan 的原因以及解决办法:logX,X为负数或0将会计算得到nan,规定X范围,可以避免nan的出现

热门文章

  1. php客流量统计,智慧店铺客流量统计系统
  2. uni-app获取手机当前连接的WIFI名称
  3. 1、定义一个复数类Complex,使得下面的代码能够工作。 Complex c1(3,5); Complex c2=4.5; c1.add(c2); c1.show();
  4. Android神兵利器之黄油刀的使用(ButterKnife)
  5. Adobe是什么软件?
  6. svn搭建报错集合(http访问)
  7. Turbo Autoencoder: Deep learning based channel code for point-to-point communication channels
  8. 数字电视业务PSI-SI学习系列
  9. APP统计报表,这几个指标最有价值
  10. 【组合数学】组合恒等式 ( 组合恒等式 积之和 1 | 积之和 1 证明 | 组合恒等式 积之和 2 | 积之和 2 证明 )