Linux使用带时区转换的时间函数注意事项(负负得正)
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使用带时区转换的时间函数注意事项(负负得正)相关推荐
- Go 学习笔记(48)— Go 标准库之 time (获取时/分/秒的单位值、标准时间和Unix时间转换、字符串时间和Time类型转换、时区转换、时间的加减/休眠)
1. 概要说明 import "time" time 包提供了时间的显示和测量用的函数.日历的计算采用的是公历. Go 提供以下几种时间类型: 时间点 Time 时间段 Durat ...
- 东八区转为0时区_Java时区转换及时间格式
本文介绍Java API 中 Date, Calendar, TimeZone和DateFormat的使用,以及不同时区时间相互转化的方法和原理. 问题描述: 向处于不同时区的服务器发请求时需要考虑时 ...
- mysql地区时间_mysql – 带时区的日期时间格式
首先,阅读DATETIME和TIMESTAMP类型in the mysql docs. 然后,决定使用哪种字段类型: >如果要在不进行MySQL执行时区转换的情况下提交,存储和检索相同的值,请使 ...
- postgre 年月日转年月_关于datetime:带时区的PostgreSQL日期函数date()
我在从Postgres正确选择日期时遇到了一个问题-这些日期存储在UTC中,但是未正确使用date()函数进行转换. 如果时间戳超过太平洋标准时间下午4点,那么将时间戳转换为日期会给出错误的日期. 在 ...
- linux自带图片转换命令,Linux 命令行处理图片(图片格式转换、缩放、旋转等)...
命令可以在"开始→运行"的文本框中,也可以事先在bat批处理文档中编写好命令.未带任何参数是注册dll文件功能,其它参数对应功能如下:.linux提供了tee命令用于完成上述程序的 ...
- 时区转换,时间格式转换
基本概念 UT - 世界时 TAI - 国际原子时 GMT - 格林尼治标准时间/格林威治平均时间 UTC - 协调世界时 LT - 本地时间 这篇文章解释的都很详细 一些时间的概念与区分(UTC.G ...
- 使用pytz模块进行时区转换及时间计算
前言 最近遇到了一个问题:我的server和client不是在一个时区,server时区是EDT,即美国东部时区,client,就是我自己的电脑,时区是中国标准时区,东八区.我需要向server发送一 ...
- 带时区的日期时间国际标准
ZonedDateTime类可以满足我们的需求. 其中每个时区都对应着 ID,地区ID都为 "{区域}/{城市}"的格式 例如 :Asia/Shanghai 等 now():使用系 ...
- linux less 带颜色,less中color函数字体颜色计算
LESS 提供了一系列的颜色运算函数. 颜色会先被转化成 HSL 色彩空间, 然后在通道级别操作: lighten(@color, 10%); // return a color which is 1 ...
最新文章
- XP快速启动栏里的显示桌面没有了,其他的都还在,应该怎么再添加进去?
- Java访问指示符 访问修饰符
- Python解释器种类以及特点?
- (53)zabbix模板
- P4111 [HEOI2015]小Z的房间
- mcafee安装是出现1920错误
- MySQL step by step 安装实战
- Jenkins构建步骤图解
- Java中的可变参数使用
- 解决办法:look up error: undefined symbol
- matlab 光谱共聚焦,激光共焦显微拉曼光谱分析实验数据处理及谱图解析
- python图灵机器人接口_apikey创建接入图灵机器人
- Sharpen 的调试步骤
- Android下的蓝牙自动配对
- @Autowired和@Resource区别
- wxPython中文教程入门实例
- 03--SSM的知识与应用之Spring
- 保密相册计算机,加密相册(新版) - 密码计算机照片保险箱 im App Store
- nsi学习之 重复安装给于提示覆盖 不可以重复安装
- 【笔记】损失函数计算后返回 nan 的原因以及解决办法:logX,X为负数或0将会计算得到nan,规定X范围,可以避免nan的出现
热门文章
- php客流量统计,智慧店铺客流量统计系统
- uni-app获取手机当前连接的WIFI名称
- 1、定义一个复数类Complex,使得下面的代码能够工作。 Complex c1(3,5); Complex c2=4.5; c1.add(c2); c1.show();
- Android神兵利器之黄油刀的使用(ButterKnife)
- Adobe是什么软件?
- svn搭建报错集合(http访问)
- Turbo Autoencoder: Deep learning based channel code for point-to-point communication channels
- 数字电视业务PSI-SI学习系列
- APP统计报表,这几个指标最有价值
- 【组合数学】组合恒等式 ( 组合恒等式 积之和 1 | 积之和 1 证明 | 组合恒等式 积之和 2 | 积之和 2 证明 )