Powershell在更改时区后显示旧时间

时间:2015-03-20 08:00:13

标签: datetime powershell

这是我的powershell脚本:

$time = (Get-Date).ToShortTimeString()
Write-Host "Current Time: "$time
$destzone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time")
$desttime = [System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), $destzone)
$desttime = $desttime.ToShortTimeString()
Write-Host "UTC-6 = "$desttime
$newtime = (Get-Date).ToShortTimeString()
Write-Host "Current Time: "$newtime
if($newtime -eq $desttime)
{
Write-Host "ok"
}else
{
C:\Windows\System32\tzutil.exe /s "Central Standard Time"
}

我想要实现的是

  1. 获取当前系统时间
  2. 将其与世界时(utc-6)进行比较
  3. 如果它相同则没有什么可做的。如果没有,请将系统时区更改为utc-6
  4. 一切正常,但是一旦将系统时区设置为utc-6,当我检查当前系统时间时,它会向我显示旧时间本身(虽然我可以看到系统时区已经改变)

    看起来像缓存。有什么相似的吗?或者我的剧本有什么问题吗?

    有人能引导我走好路吗?

1 个答案:

答案 0 :(得分:1)

这不是你的剧本的错。 Powershell仅在创建会话时读取时区。

Get-Date和.Net方法如[System.TimeZoneInfo]::Local“缓存”这个,所以最简单的解决方案是关闭窗口并启动新的Powershell会话。开始一个新的本地会话并导入它也“解决”了问题,但是相当笨重。

WMI对象不受同一“缓存”问题的影响。 将此视为一种选择:

$curzone = (Get-WMIObject –Class Win32_TimeZone).Caption
$destzone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time").DisplayName
if($curzone -eq $destzone)
{
Write-Host "Current Time Zone already set to:"$curzone
}else
{
C:\Windows\System32\tzutil.exe /s "Central Standard Time"
$newcurzone = (Get-WMIObject –Class Win32_TimeZone).Caption
Write-Host "Time Zone updated to:"$newcurzone
}

P.S。如果他们稍后修复此问题,目前可以使用Powershell 5.0重现Windows 10技术预览2