Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTCTime)、文件时间(FileTime)之间的转换

摘要:
首先,让我们从一个简单的角度出发。本地时间是系统设置的时区的当前时间!为了澄清什么是系统时间,让我们首先了解格林威治标准时间。那么,上述示例中的东区8的时间比格林威治标准时间多8小时!Windows的系统时间是格林威治标准时间!让我们来谈谈系统时间和文件时间之间的转换,以及本地时间和文件时之间的转换。

  首先,先从简单的说起,本地时间(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结构,都是给出的文件时间!知道了这一点,将它们转换为本地时间就很容易了。

--克劳德曼

2012-5-18 21:09:36

免责声明:文章转载自《Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTCTime)、文件时间(FileTime)之间的转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高德定位获取经纬度,街道城市名称(九)Docker-PS 详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于Linux的时间与时区

转:http://linux.chinaunix.net/techdoc/beginner/2007/06/22/960790.shtml 首先要说明的是我的系统是fedora,其他系统可能不完全相同。1,时间保存在硬件实时钟(RTC)中,RTC由主板电池供电,即使关断电源也不会造成时间丢失。2,系统启动时从RTC获取时间,这个步骤在rc.sysinit中...

Python实例讲解 -- 获取本地时间日期(日期计算)

1. 显示当前日期:   1 #! /usr/bin/env python2 #coding=utf-83 4 import time5 6 print time.strftime('%Y-%m-%d %A %X %Z',time.localtime(time.time())) 或者 1 #! /usr/bin/env python2 #coding...

LocalDate,LocalTime,LocalDateTime的基本使用

​ Java8提供的新的时间日期的类型LocalDate,LocalTime,LocalDateTime。之前用的Date和Calendar都为线程不安全。用来格式化Date类型的SimpleDateFormat也是线程不安全的。LocalDate和格式化LocalDate的DateTimeFormatter是线程安全的。 LocalDate的使用 创建L...

java里的时间操作之LocalDate、LocalTime、LocalDateTime

1.首先: 为什么使用LocalDate、LocalTime、LocalDateTime而不是Date https://juejin.im/post/5d7787625188252388753eae 一句话总结还是因为SimpleDateFormat的线程安全问题 2.如何学习LocalDate、LocalTime、LocalDateTime 三者都是ja...

python小专题——time模块

time常用函数 最近参与python的一个项目,发现经常遇到一些常用的模块,而每次使用时,我都要查一遍。终于,我决定要各个击破,对常用的python小知识进行总结。下面总结了python中对时间处理的常见函数。 在开始之前,首先要说明这几点: 在Python中,通常有这几种方式来表示时间:1)、时间戳 2)、格式化的时间字符串 3)、元组(struct...

java中日期的换算处理

JAVA8中的日期API是JSR-310的实现,并且是工作在ISO-8601日历系统基础上的,但我们也可以在非ISO的日历上。JDK8的日期API大致分为以下几个包: 1 java.time包:JDK8中的基础包,所有常用的基础类都是这个包的一部分,如LocalDate,LocalTime,LocalDateTime等等,所有这些类都是不可变且线程安全的...