今天我们继续讲如何检查本地的工作站上日期和时间和时区问题及解决方法。
我们的服务器和用户的计算机经常会不准确,其中的原因是时间偏移,有人告诉我,一些工作站的时钟慢1小时。
大多数运维人员利用PowerShell脚本写了一个快速获取原始的WMI本地日期和时间值在远程机器上的列表,将其转换为可读的DateTime对象这样就可以解决
1
2
3
4
5
6
7
|
$computers = 'pc1' , 'pc2' , 'pc3'
$computers | ForEach-Object {
$os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $_
$cdt = @{Name= 'ConvertedDateTime' ;Expression={ $_ .ConvertToDateTime( $os .LocalDateTime)}}
$os | Select-Object -Property Name,LocalDateTime, $cdt
} |
这样你会得到
1
2
3
4
5
|
Name LocalDateTime ConvertedDateTime ---- ------------- ---- pc1 20130627093710.927000+120 6/27/2013 9:37:10 PM pc2 20130627103722.322000+120 6/27/2013 9:37:22 PM pc3 20130627103703.530000+120 6/27/2013 9:37:03 PM |
让我们看看最后一列,现在我们能够确定有问题的机器上的时间是正确的,是吗?
错了!请在仔细看看结果输出的list。
你发现什么异常吗?大家可能会注意到,在PC1和PC2中间有一个小时的时差,是在LocalDateTime得到的和9VS10。
我我印象中这样应该反生在远程计算机 DMTF转换,但显然这是不对的。
通过ETS(扩展类型系统)来用于计算属性的方法参数:ConvertToDateTime,
我们脚本中应该具有:[System.Management.ManagementDateTimeconverter] :: ToDateTime。
MSDN中的方法描述:将一个给定的的DMTF日期和时间为DateTime。返回的DateTime将是该系统在目前的时区。
这就提出了一个问题:这个方法用之后得到的是当前时区的远程计算机或者执行脚本的机器的时区吗?
不支持远程连接ToDateTime方法转换,所以只能在本地完成。没有人真正检查LocalDateTime的价值,我一直以来计算用的是的ConvertToDateTime方法。
现在,我们知道使用LocalDateTime价值,来写出脚本,进行计算机上面的时间转换(Win32_LocalTime类支持XP / Windows Server 2003和以上):
1
2
3
4
5
6
7
|
PS> $lt = Get-WmiObject -Class Win32_LocalTime -ComputerName pc1
PS> Get-Date -Year $lt .Year -Month $lt .Month -Day $lt .Day -Hour $lt .Hour -Minute `
$lt .Minute -Second $lt .Second
Thursday, June 27, 2013 21:37:10 AM or PS> [datetime] ::ParseExact( $lt .split( '.' )[0], 'yyyyMMddHHmmss' , $null )
Thursday, June 27, 2011 21:37:10 AM |
谢谢大家,今天事情有点忙,更新慢一点。
本文转自cantgis 51CTO博客,原文链接:http://blog.51cto.com/cantgis/1231246,如需转载请自行联系原作者