2012-06-14 6 views
10

TimeZone을 사용하여 내 시스템에 현지 시간을 표시하려고합니다. 어떻게 모든 시스템이 흥분 되나요 가능한 형식으로 간단한 방법을 시간을 표시 할 수 있습니다Powershell 시간대로 현재 시간 표시

시간 : 동부 표준시 오전 8시 0분 34초

나는 현재 다음과 같은 스크립트를 사용하고

:

$localtz = [System.TimeZoneInfo]::Local | select-object -expandproperty Id 
if ($localtz -match "Eastern") {$x = " EST"} 
if ($localtz -match "Pacific") {$x = " PST"} 
if ($localtz -match "Central") {$x = " CST"} 
"Time: " + (get-date).Hour + ":" + (get-date).Minute + ":" + (get-date).Second + $x 

을 간단한 논리에 의존하지 않고 시간을 표시 할 수 있지만 모든 시스템에서 현지 시간대를 제공 할 수 있기를 바랍니다. 감사!

답변

9

조금 ... 순진 아마도, 그것은 를 얻을 수있는 하나의 방법 스위치가없는 약어 :

[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1') 

내 레그 lar expression은 아마 원하는 것을 남겨 둘 것입니다.

위의 시간대 출력은 EST입니다. 다른 GMT 오프셋 설정 값이 무엇인지보고 싶었 기 때문에 일부를 보았습니다. .NET은 DateTimeTimeZoneInfo 사이의 링크가 좋지 않은 것처럼 보이므로 프로그래밍 방식으로 모두 검사하여 확인할 수는 없었습니다. . StandardName으로 돌아 오는 일부 문자열에 대해 제대로 작동하지 않을 수 있습니다.

편집 : 내 컴퓨터의 시간대를 변경 좀 더 조사가 수동으로 GMT+12이와 TimeZoneInfo을 확인 않았다 다음과 같습니다

: 내 코드에이 결과를 생성

PS> [TimeZoneInfo]::Local 

Id       : UTC+12 
DisplayName    : (GMT+12:00) Coordinated Universal Time+12 
StandardName    : UTC+12 
DaylightName    : UTC+12 
BaseUtcOffset    : 12:00:00 
SupportsDaylightSavingTime : False 

PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1') 
U+12 

따라서 StandardName은 표준 이름이 없기 때문에 단어 집합이거나 그냥 오프셋 지정으로 표시되는지 여부를 감지해야합니다.마지막으로

PS> [TimeZoneInfo]::Local 

Id       : Tokyo Standard Time 
DisplayName    : (GMT+09:00) Osaka, Sapporo, Tokyo 
StandardName    : Tokyo Standard Time 
DaylightName    : Tokyo Daylight Time 
BaseUtcOffset    : 09:00:00 
SupportsDaylightSavingTime : False 

PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1') 
TST 
+0

아름다움처럼 작동합니다! –

+0

@Ken 나는 그것에 조금 희롱되었다. 그러나 나는 트릭을했기 때문에 기쁘다 :). – Shibumi

+1

'SA 태평양 표준시'는'SPST'가됩니다. 정말 정확하지는 않습니다. 당신이 제공 한 정보는 매우 도움이되었습니다. 나는 단지 분 오프셋을 얻는 것에 정착하기로 결정했다. '[System.TimeZone] :: CurrentTimeZone.GetUtcOffset ([datetime] :: Now) .TotalMinutes' – VertigoRay

1

나는 당신을 위해 일할 수있는 어떤 대상인지 모른다.

function Get-MyDate{ 

    $tz = switch -regex ([System.TimeZoneInfo]::Local.Id){ 
     Eastern {'EST'; break} 
     Pacific {'PST'; break} 
     Central {'CST'; break} 
    } 

    "Time: {0:T} $tz" -f (Get-Date) 
}  

Get-MyDate 

을 또는 심지어 타임 존 ID의 이니셜을 : 당신은 함수에서 논리를 포장 할 수

$tz = -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]}) 
"Time: {0:T} $tz" -f (Get-Date) 
+0

하면보고 있는지 여부를 확인하기 위해 IsDaylightSavingTime''전화를 기억 'StandardName' (이것은'Id'와 같지만 언제나 사실인지 확실하지 않습니다) 또는'DaylightName' 속성입니다. 또한 다른 모든 시간대의 기본 경우를 처리해야합니다. – Richard

+0

@ 리차드 기본 사례에 어떤 문제가 있습니까? –

+0

하나도 존재하지 않습니다. – Richard

6

당신은 DateTime format strings으로 보일 것입니다. 시간대 단축 이름을 반환 할 수 있는지 확실하지 않지만 UTC에서 쉽게 오프셋을 가져올 수 있습니다.

$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date) 

이 반환 :

8:00:34 AM -04:00 
+0

포맷에 대한 도움을 주셔서 감사합니다. 그러나 시간대를 연결하는 방법을 찾아야합니다. –

3

다른 날짜 형식을 정의하는 혐오하세요! 기존의 것을 사용하십시오 (예 : rfc 1123). Powershell 바로 가기가 있습니다!

get-Date -format r 

2012년 6월 14일 (목)이 있지만 그리니치 표준시 16시 44분 18초

http://technet.microsoft.com/en-us/library/hh849887.aspx

+5

매우 정확하지는 않습니다. 현재 GMT보다 1 시간 앞선 'BST'일 때 GMT를보고합니다. – Richard

+0

그러나 현재 시간대가 GMT가 아니기 때문에 이것은 올바르지 않습니다. 이전에 형식을 사용했지만 올바른 표준 시간대 대신 항상 GMT를 제공합니다. –

+6

시간대에 관계없이 GMT를 받으면 하드 코딩 됨 - (Get-Culture) .DateTimeFormat.RFC1123Pattern, –

0

그냥 결합 된 여러 스크립트와 내 도메인 컨트롤러에서 스크립트를 실행 할 수 있었다 : 미국 이외의

적은 문제가있는 사람은 세 단어의 형식을 따라 나타납니다. 스크립트는 도메인에 연결된 모든 시스템에 대한 시간 및 시간대 출력을 제공합니다. 우리는 응용 프로그램 서버에 큰 문제가 있었으며이 스크립트를 사용하여 시간과 시간대를 교차 검사했습니다.

  #Below Scripts provides the Time and TimeZone for the Connected Machines in a Domain 
      #Appends the Output to a text file with the time stamp 
      #Checks if the host is reachable or not via ping command 

      Start-Transcript -path C:\output.txt -append 
      $ldapSearcher = new-object directoryservices.directorysearcher; 
      $ldapSearcher.filter = "(objectclass=computer)"; 
      $computers = $ldapSearcher.findall(); 

      foreach ($computer in $computers) 
      { 
       $compname = $computer.properties["name"] 
       $ping = gwmi win32_pingstatus -f "Address = '$compname'" 
       $compname 
       if($ping.statuscode -eq 0) 
       { 
        try 
        { 
         $ErrorActionPreference = "Stop" 
         write-host “Attempting to determine timezone information for $compname…” 
         $Timezone = Get-WMIObject -class Win32_TimeZone -ComputerName $compname 

         $remoteOSInfo = gwmi win32_OperatingSystem -computername $compname 
         [datetime]$remoteDateTime = $remoteOSInfo.convertToDatetime($remoteOSInfo.LocalDateTime)  

            if($Timezone) 
         { 
          foreach($item in $Timezone) 
          { 
           $TZDescription = $Timezone.Description 
           $TZDaylightTime = $Timezone.DaylightName 
           $TZStandardTime = $Timezone.StandardName 
           $TZStandardTime = $Timezone.StandardTime 

          } 
          write-host “Timezone is set to $TZDescription`nTime and Date is $remoteDateTime`n**********************`n” 

         } 
        else 
         { 
          write-host ("something went wrong") 
         } 

        } 
        catch 
        { 
         write-host (" you have insufficient rights to query the computer or the RPC server is not available") 
        } 
        finally 
        { 
         $ErrorActionPreference = "Continue" 
        } 

       } 
       else 
         { 
          write-host ("Host $compname Not reachable from ping `n") 
         } 

      } 

      Stop-Transcript 
0

이 더 나은 대답 :

$A = Get-Date     #Returns local date/time 
$B = $A.ToUniversalTime()  #Convert it to UTC 

# Figure out your current offset from UTC 
$Offset = [TimeZoneInfo]::Local | Select BaseUtcOffset 

#Add the Offset 
$C = $B + $Offset.BaseUtcOffset 
$C.ToString() 

출력 : 2017년 3월 20일 오후 11시 55분 55초

관련 문제