Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换
首先,先从简单的说起,本地时间(LocalTime),也就是系统设置时区的当前时间!比如说当前系统设置的时区为“(UTC+08:00)北京,重庆,香港特别行政区,乌鲁木齐”(东八区),系统的右下角通知区域显示的时间为“2012/5/18 16:57”,那么这个时间就是当前系统的本地时间!
要说清楚什么是系统时间(SystemTime)之前先来了解一下格林威治时间。本初子午线被定义为通过格林威治经线的位置,相对这条经线的时区向东递增,向西递减,每隔一个时区,相差一个小时。那么,上面例子中的东八区的时间就是相对于格林威治时间加上了八个小时!而Windows的系统时间是就是格林威治时间!知道了这一点,本地时间与系统时间之间的转换也就很容易了。将上面的本地时间“2012/5/18 16:57”转换到系统时间只要减去八个小时就行了!转换结果为“2012/5/18 8:57”。
本地时间与系统时间的都是用SYSTEMTIME结构来存储的,关于这个结构参见MSDN。
文件时间(FileTime)的存储方式则与本地时间、系统时间有些不同,它使用64位的数据长度存储。引用MSDN上面的一句原话“A file time is a 64-bit value that represents the number of 100-nanosecond intervals that have elapsed since 12:00 A.M. January 1, 1601 Coordinated Universal Time (UTC).”这个64位的值记录了自1601年1月1日0点以来的以100纳秒(ns)为单位的格林威治时间间隔,注意,是纳秒,不是毫秒!将这个数据转换为秒的话要除以10^7(1秒 = 10^9纳秒,这里是100纳秒单位)!了解了上面的格林威治时间,理解这个很容易!
本地时间与系统时间之间的转换上面已经说了,这其中的转换因子就是当前系统的时区,也可以通过SystemTimeToTzSpecificLocalTime、TzSpecificLocalTimeToSystemTime两个函数来完成,这两个函数在转换时都要指定时区信息,具体用法参考MSDN。下面谈谈系统时间与文件时间、本地时间与文件时间之间的转换。因为用到文件时间的地方不仅仅限于记录文件的创建、修改时间。而且还可以通过文件时间的转换函数来完成系统时间与本地时间的转换!
1. 系统时间与文件时间的转换:SystemTimeToFileTime、FileTimeToSystemTime
2. 本地时间与文件时间的转换:LocalFileTimeToFileTime、FileTimeToLocalFileTime
从上面可以看出,本地时间与系统时间的转换也可以通过文件时间来完成。这里需要注意一点的是,本地时间和文件时间都是对于当前系统的时区而言的,这样会出现同一个文件放到不同时区的系统中时,文件的创建时间,修改时间等等都会不一样。因为文件创建时间,修改时间等都是以文件时间方式记录的,操作系统在将文件时间转换为本地时间时要根据系统当前的时区作为参考。所以,在系统时间与本地时间之间转换时最好的方式是采用文件时间函数,这样时区的问题会由操作系统解决。此外,还有一些函数使用的数据结构中也用到了文件时间,比如用于检索系统定时信息的GetSystemTimes的参数、查询系统时间信息时用到的NtQuerySystemInformation中的SYSTEM_TIME_INFORMATION结构,都是给出的文件时间!知道了这一点,将它们转换为本地时间就很容易了。
Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换的更多相关文章
- Linux 文件时间记录属性 调优
Linux 文件时间属性介绍 atime:(access time)显示的是文件中的数据最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用.(执行一些可执行文件或脚本) mtime: ...
- IO系统-标准C的I/O和文件I/O
1.标准C的I/O 1.1常用函数和结构体 char *fgets(char *s, int size, FILE *stream); //整行输入 int printf(const char *fo ...
- ubuntu下的时间设定(硬件时间,系统时间,本地时间)
问题的来由是在这里: 在cron里设定任务是在凌晨6点执行,检查日志时发现时间总是不对,是在22点左右的时间执行的.研究发现,任务是在本地时间的6点执行了,但不知为什么syslog中的时间都是为utc ...
- BIOS时间与系统时间(windows/linux时间同步问题)
写作动机 双系统是不少人喜欢的方式,但安装双系统之后一般会出现两个系统时间不一样的问题,刚开始用双系统的时候也没怎么在意,就是装上后在网上找找相关解决方法,复制粘贴代码完事儿.但是次数多了就有点烦了, ...
- Linux的硬件时间、校正Linux系统时间及系统时间调用流程
第一部分: 一)概述: 事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间 UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时. ...
- linux 系统文件类型、系统安装时间、系统启动时间、系统运行时间、设置及显示时间、系统时间和硬件时间
系统文件类型: 1) $mout 2) df -l:仅列出本地文件系统:-h (--human-readable):-T:文件系统类型 $df -lhf 3) file -s (--special-f ...
- win10 + Ubuntu 双系统,重装后的引导修复,时间调整和启动项调整
▶ 原先为 win10 + Ubuntu 双系统,使用 grub2 作引导,在重装了 win10 (大作死升到了1803)后系统重写了引导,启动项里找不到 Ubuntu,需要修复. ● 参考[http ...
- Linux修改日期、时间,系统与硬件时间
Linux的时间分为两种,硬件时间和系统时间两种: 一.查看与修改系统时间 查看系统时间:date # date Fri Nov 26 15:20:18 CST 1999 用指定的格式显示系统时间: ...
- IIS7日志中时间与系统时间不一致的原因
最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日 ...
随机推荐
- angular2 单元测试 路由相关
第一步:在html模板中,写路由链接,并保证有路由出口 第二步:写自定义的路由指令和路由出口组件,因为在单元测试中不需要引入真实的路由,此处我们用虚拟的代替即可. 第三步:将自定义的虚拟路由指令和路由 ...
- Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat
<resultMap id="BaseResultMap" type="com.youotech.tl_cons_credit_rating.entity.TL_C ...
- vue 每20秒刷新1次接口的实现方法
实现代码: setInterval(() => { setTimeout(fun, ) }, ) 备注: setInterval 放在内层 长时间会影响性能,造成页面卡顿甚至崩溃, 内层配合se ...
- Codeforces Round #622 (Div. 2) A. Fast Food Restaurant
Tired of boring office work, Denis decided to open a fast food restaurant. On the first day he made ...
- Spring的简单介绍
struts2:web层hibernate:dao层spring:service层 1 spring框架概述 1.1 什么是springSpring是一个开源框架,Spring是于2003 年兴起的一 ...
- 【PAT甲级】1087 All Roads Lead to Rome (30 分)(dijkstra+dfs或dijkstra+记录路径)
题意: 输入两个正整数N和K(2<=N<=200),代表城市的数量和道路的数量.接着输入起点城市的名称(所有城市的名字均用三个大写字母表示),接着输入N-1行每行包括一个城市的名字和到达该 ...
- 腾讯云Windows Server下nodejs websocket ssl配置
1.从腾讯云申请SSL证书,下载解压,得到如下文件: 2.nodejs代码: // wss.js const fs = require('fs'); // 一些配置信息 const cfg = { p ...
- C语言:假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母。-利用折半查找整数m在有序数组中的位置,若找到,返回下标值,否则返回-1。
//假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母. #include <stdio.h> void f ...
- servlet类常用代码
1.设置响应编码格式 response.setContentType(");
- IOS XE-show memory
有些时候,我们可能会遇到IOS XE设备的high memory的情况.我们可以使用的命令去查看相关信息. 例如: Router# show version Router# show memory R ...