//=====================================================================

//TITLE:

//    UTC转换本地时间

//AUTHOR:

//    norains

//DATE:

//    Friday 26- March-2010

//Environment:

//     WINDOWS XP

//     WINDOWS CE

//=====================================================================

一般情况下,我们很少需要用到UTC转换为本地时间--因为如果仅仅是获取本机的本地时间,我们完全可以不用如此麻烦,直接调用GetLocalTime即可。

即使万一真的需要用到UTC转换到特定时区的本地时间,只要你是在WinXP的环境下,也并不会花费太大的劲,只要调用SystemTimeToTzSpecificLocalTime函数:

SYSTEMTIME sysTime = {0};

//获取系统时间。和GetLocalTime不同,该函数返回的为UTC时间

GetSystemTime(&sysTime);

//中国时区的信息

TIME_ZONE_INFORMATION DEFAULT_TIME_ZONE_INFORMATION = {-480};

//将UTC时间转换为中国时区的本地时间

SystemTimeToTzSpecificLocalTime(&DEFAULT_TIME_ZONE_INFORMATION,&sysTime,&sysTime);

就这么简单,调用一个函数即可进行转换。可能大家唯一疑惑的是DEFAULT_TIME_ZONE_INFORMATION的取值是怎么来的,其实很简单,TIME_ZONE_INFORMATION的时差是以分钟为单位的,北京时差为8个小时,所以8*60=480。如果是别的时区,可以依此进行更改。

WinXP是简单了,但对于WinCE却是麻烦了。相对于WinXP来说,需要用到时区转换的机会更多,因为很多系统定制时,习惯于定义系统的默认语言为英文,以此加快加载速度和减小系统容量,所以在显示时间时必须要进行一次UTC的时间转换。可这更常使用的场合,却偏偏没有SystemTimeToTzSpecificLocalTime函数!

没辙,活人总不能被尿给憋死吧?微软不为我们准备,那我们就自己丰衣足食咯!

我们先从原理上想想这时区的转换,其实无非就是UTC时间偏移多少个小时,也就一个简简单单的加加减减。但问题在于,SYSTEMTIME是一个结构体,成员有秒、分、时等等。如果只是时间上的加减倒还是简单,毕竟都是60进制的;但涉及到日期,却不是一般的麻烦了。比如是今天是1号,那前一天是几号?这个不仅涉及到大小月,还有闰月的问题。不仅如此,还需要判断当前是星期几,这也不是一件轻松的事情。所以,直接采用SYSTEMTIME进行计算,对于我们来说是不太现实。

那我们换个角度来想,SYSTEMTIME不方便,那么我们转换为FILETIME来计算不就可以了么?FILETIME可是以100个亿分之一秒为单位的啊,这不就可以直接加减了么?话虽如此,但还是有个问题。我们来看看FILETIME的声明:typedef struct _FILETIME {

DWORD dwLowDateTime;

DWORD dwHighDateTime;

} FILETIME;

问题就来了,FILETIME是一个结构体,包含了两个成员,我们无法直接进行算术运算!

别急,问题还不是很严重。仔细观察一下,FILETIME是由两个DWORD组成,每个DWORD是32bit,一共64bit。那么,我们直接用一个64bit的变量存储该数值,不就可以简单地进行运算了?

所以,我们WinCE下自力更生的SystemTimeToTzSpecificLocalTime函数出炉了:BOOLSystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone,LPSYSTEMTIME lpUniversalTime,LPSYSTEMTIME lpLocalTime)

{

if(lpTimeZone == NULL || lpUniversalTime == NULL || lpLocalTime == NULL)

{

//如果指针为空,则没有必要进行任何计算

return FALSE;

}

//将UTC时间由SYSTEMTIME转换为FILETIME格式

FILETIME ftUniversalTime = {0};

SystemTimeToFileTime(lpUniversalTime,&ftUniversalTime);

//将FILETIME格式时间的数值存储到一个DWORD64变量中

DWORD64 ddwUniversalTime = ftUniversalTime.dwHighDateTime;

ddwUniversalTime = ddwUniversalTime << 32;

ddwUniversalTime += ftUniversalTime.dwLowDateTime;

//因为FILETIME的时间单位是100个亿分之一秒,然后TIME_ZONE_INFORMATION的时间单位是分,所以这里需要乘以600000000

DWORD64 ddwBias = abs(lpTimeZone->Bias);

ddwBias *= 600000000;

//转换公式为:LOCAL_TIME = UTC - BIAS

DWORD64 ddwLocalTime = 0;

if(lpTimeZone->Bias > 0)

{

ddwLocalTime = ddwUniversalTime - ddwBias;

}

else if(lpTimeZone->Bias < 0)

{

ddwLocalTime = ddwUniversalTime + ddwBias;

}

//将DWORD64数值转换为FILETIME格式

FILETIME ftLocalTime = {0};

ftLocalTime.dwLowDateTime = static_cast(ddwLocalTime);

ftLocalTime.dwHighDateTime = static_cast(ddwLocalTime >> 32);

//将FILETIME数值转换为SYSTEMTIME格式并返回

return FileTimeToSystemTime(&ftLocalTime,lpLocalTime);

}

因为该函数的接口和WinXP的一模一样,所以文章开头的代码,我们可以不用做任何更改就能正确地在WinCE中运行了!

utc时间 单位换算_UTC转换本地时间相关推荐

  1. utc时间 单位换算_c++ 时间类型详解 time_t

    Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00 ...

  2. utc时间 单位换算_数学基础知识点总结,常用单位换算长度、时间、面积等分类...

    在所有的课程中间,数学贯穿了整个学习生涯,对于学生学习数学知识,要培养学生对数学应用价值的意识,能解决简单的实际问题.数学有助于学生理解现实生活中的数的意义,引导学生培养估算能力.下面就讲一下在实际教 ...

  3. 计算机系统中时间周期的单位,时间单位换算 (全),计算机单位换算大全

    常用单位换算 长度单位换算 1千米=1000米 1米=10分米 1分米=10厘米 1米=100厘米 1厘米=10毫米 面积单位换算 1平方千米=100公顷 1公顷=10000平方米 1平方米=100平 ...

  4. utc时间 单位换算_一些时间的概念与区分(UTC、GMT、LT、TAI等)

    UT - 世界时 Universal Time 世界时是最早的时间标准.在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104.以此标准形成的时间系统,称为世界时,即 UT1. 19 ...

  5. utc时间 单位换算_日期时间

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 使用time模块显示当前日期和时间 开发一个以多种格式显示当前时间和日期的程序.转换秒数为GMT时间.你要 ...

  6. Linux下C语言时间函数使用及UTC时间转换本地时间

    #include <stdio.h> #include <time.h> //gcc time_test.c -o time_test int main() {time_t n ...

  7. 微秒, 纳秒,毫秒, 时间单位换算

    秒也是一个的时间单位,0.000 000 001 毫秒 = 1皮秒,0.000 001 毫秒 = 1纳秒,0.001 毫秒 = 1微秒,1毫秒等于0.001秒,60秒等于1分钟,60分钟等于1小时,2 ...

  8. ms、s、min、h时间单位换算

    一.背景 有一个延迟时间的字段数据,后端默认返回的是ms,但是返回的时候有可能数据量较大,所以需要前端根据后端返回的值去换算单位. 二.代码版本更迭 1. 第一版 思路: 根据后端返回的值和换算的临界 ...

  9. php 把unix时间转换成时间,php unix时间戳转换成时间的方法

    php unix时间戳转换成时间的方法:首先创建一个PHP示例文件:然后通过"date('Y-m-d H:i:s', 1547740800);"方式将指定的unix时间戳转换成时间 ...

  10. python获取本地时间_Python实例讲解 -- 获取本地时间日期(日期计算)

    #! /usr/bin/env python #coding=utf-8 import time print time.strftime('%Y-%m-%d %A %X %Z',time.localt ...

最新文章

  1. [九度][何海涛] 数组中出现次数超过一半的数字
  2. shell变量设置与显示
  3. OpenCV为Halide后端安排网络
  4. python编译环境 eclipse_eclipse搭建python编译环境
  5. springboot 获取yml变量_springboot怎么读取不同yml配置文件
  6. 定时任务莫名停止,Spring 定时任务存在 Bug??
  7. linux进程泄漏如何定位,定位Linux下定位进程被谁KILL
  8. OneNote2016 解决 OneNoteGem 插件 选项卡消失的问题
  9. 魔兽世界——暮光高地任务攻略
  10. 0x0000005c蓝屏问题解决
  11. CAD删除全部文字(网页版)
  12. css灯箱放大图片,wordpress插件wordpress文章图片放大灯箱效果插件auto-highslide优化版...
  13. Android开发动态的监听网络状态的变化
  14. iVMS-4200 Vs区别_55436红单足球预测 法甲 21:00 安格斯 VS 梅斯
  15. 本章设计了三种不同的神经网络,神经网络简答题
  16. 用胶带屏蔽PCIE接口解决兼容问题,150块的P104矿渣卡也能跑深度学习
  17. 我的微信扫描二维码实现登录のJava
  18. 现在的千兆光猫都自带路由功能,是否就不需要路由器了?
  19. 肖战真的没我帅!我自己写的Python颜值检测说的!
  20. 《C专家编程》学习笔记

热门文章

  1. 请问在深圳做美工的工资多少
  2. BDC模式与OKCODE、 CALL TRANSACTION用法
  3. 定时删除微信文件夹中重复文件
  4. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0
  5. h3c服务器系统丢失,某局点H3C FlexServer R390服务器阵列失败数据丢失的经验案例...
  6. MenuetOS小系统安装
  7. php是什么电器元件,看完这个保证你认识“贴片电路板上”的每一个电子元件
  8. 《都挺好》一部黑码农的神剧!
  9. 你不是不优秀,而是太着急
  10. 通过Python爬取必应壁纸,学XPath