2012-06-14 22 views
10

मैं टाइमज़ोन के साथ अपने सिस्टम पर स्थानीय समय प्रदर्शित करने की कोशिश कर रहा हूं। मैं कैसे सबसे आसान तरीका संभव किसी भी प्रणाली ?: पर इस प्रारूप में समय प्रदर्शित कर सकते हैंपावरहेल समय क्षेत्र के साथ वर्तमान समय प्रदर्शित करें

समय: 08:00: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') 

मेरा regu लार अभिव्यक्ति शायद वांछित होने के लिए कुछ छोड़ देता है।

मेरे समय क्षेत्र के लिए उपरोक्त का आउटपुट EST है। मैंने कुछ ऐसा देखा क्योंकि मैं देखना चाहता था कि अन्य जीएमटी ऑफ़सेट सेटिंग्स के लिए मूल्य क्या होगा, लेकिन .NET में DateTime और TimeZoneInfo के बीच बहुत अच्छे लिंक नहीं दिखते हैं, इसलिए मैं प्रोग्रामिंग के माध्यम से प्रोग्रामिंग के माध्यम से केवल सभी को चलाने के लिए नहीं चला सकता । यह 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

@ केन मैं उस पर थोड़ा शर्मिंदा था, लेकिन मुझे खुशी है कि यह चाल है :)। – Shibumi

+1

'एसए प्रशांत मानक समय '' एसपीएसटी' बन गया; जो वास्तव में सटीक नहीं है। आपके द्वारा दी गई जानकारी हालांकि बहुत उपयोगी थी। मैंने बस ऑफसेट ऑफसेट प्राप्त करने का फैसला किया: '[System.TimeZone] :: CurrentTimeZone.GetUtcOffset ([डेटाटाइम] :: अब)। टोटलमिन्यूट्स ' – 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 

या यहां तक ​​कि समय क्षेत्र आईडी के नाम के पहले अक्षर ले:

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

'IsDaylightSavingTime' कॉल करने के लिए को देखने के लिए कि क्या जांच करने के लिए याद रखें 'मानक नाम '(मुझे लगता है कि यह' आईडी 'जैसा ही है, लेकिन अगर हमेशा सत्य है तो अस्पष्ट) या' डेलाइटनाम 'संपत्ति। इसके अलावा आपको अन्य सभी टाइमज़ोन के लिए डिफ़ॉल्ट केस को संभालने की आवश्यकता है। – Richard

+0

@ रिचर्ड डिफ़ॉल्ट मामले में क्या गलत है? –

+0

कोई नहीं है। – Richard

6

आप DateTime format strings ध्यान देना चाहिए। हालांकि मुझे यकीन नहीं है कि वे एक समय क्षेत्र संक्षिप्त नाम वापस कर सकते हैं, आप आसानी से यूटीसी से ऑफसेट प्राप्त कर सकते हैं।

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

यह रिटर्न:

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

मैं फ़ॉर्मेटिंग के साथ सहायता की सराहना करता हूं। हालांकि, मुझे अभी भी समय क्षेत्र को जोड़ने का एक तरीका पता लगाना है। –

3

एक और दिनांक प्रारूप परिभाषित करने के लिए घृणा रहो! मौजूदा का उपयोग करें, जैसे कि rfc 1123। यहां तक ​​कि एक पावरहेल शॉर्टकट भी है!

get-Date -format r 

गुरु, 14 जून 2012 16:44:18 GMT

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

+5

ध्यान दिया जाना चाहिए कि यह बहुत सटीक नहीं है: वर्तमान में 'जीएमटी 'रिपोर्ट करता है जब यह वास्तव में' बीएसटी' (जीएमटी से एक घंटा आगे) होता है। – Richard

+0

लेकिन यह सही नहीं है क्योंकि वर्तमान समय क्षेत्र जीएमटी नहीं है। मैंने पहले प्रारूप का उपयोग किया था लेकिन यह हमेशा सही समय क्षेत्र के बजाय जीएमटी देता है। –

+6

आपको अपने समय क्षेत्र के बावजूद जीएमटी मिलता है, यह कठिन कोडित है - (गेट-कल्चर) .डेटाइमफॉर्मैट.आरएफसी 1123 पैटर्न, –

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/03/20 11:55:55

संबंधित मुद्दे