ค้นหาเว็บไซต์

แปลงเป็นเวลาท้องถิ่นด้วย PowerShell


ดังที่บางท่านทราบ ฉันโฮสต์แชทออนไลน์บน Twitter ทุกเดือนในวันศุกร์แรกของทุกเดือนโดยใช้แท็ก #PSTweetChat (แม้ว่าแชทในเดือนมกราคม 2021 จะเป็นวันที่ 8 มกราคมก็ตาม) เราจะมารวมตัวกันและพูดคุยเกี่ยวกับ PowerShell ทุกเรื่องที่ 1: 00.00 น. ตามเวลาตะวันออก ความท้าทายสำหรับส่วนที่เหลือของโลกคือการทำให้แน่ใจว่าพวกเขารู้ว่าเวลาใดคือเวลาสำหรับพวกเขา ฉันเคยอยู่อีกด้านหนึ่งของสิ่งนี้เช่นกัน ฉันต้องเข้าร่วมกิจกรรมซึ่งเป็นเวลา 10.00 น. ตามเวลามาตรฐานยุโรปกลาง สำหรับฉันเมื่อไหร่? ฉันใช้เวลาทั้งวันใน PowerShell ดังนั้นจึงควรมีวิธีง่ายๆ ในการตอบคำถามนั้น

เชนานิแกน DateTime

และแน่นอนว่ายังมี คลาส [DateTime] มีเมธอดที่เรียกว่า ToLocalTime() ซึ่งจะแปลงเวลา UTC เป็นเวลาท้องถิ่นของคุณ ในการแปลงกิจกรรม 10.00 น. CET ของฉันเป็นเวลาท้องถิ่น ฉันต้องแปลงเวลานั้น เป็น UTC จากนั้นตามเวลาท้องถิ่น

ส่วนแรก และสามารถทำได้ 2-3 วิธี คือการสร้างออบเจ็กต์วันที่และเวลาสำหรับ 10.00 น. CET ฉันไม่สามารถเรียกใช้ Get-Date ได้ เพราะผลลัพธ์ใดๆ จะสัมพันธ์กับเขตเวลา ของฉัน ที่จริงแล้วฉันทำได้

 $datetime = Get-Date "12/30/2020 10:00AM"

สิ่งที่ฉันต้องทำคือปรับค่านี้ให้ตรงกับเขตเวลา CET ถ้าอย่างนั้น ฉันต้องรู้เขตเวลา ไม่มีปัญหา.

$tzone = Get-TimeZone -Id "Central European Standard Time"

ฉันจะถือว่าคุณจะดูความช่วยเหลือและตัวอย่างสำหรับคำสั่งนี้ ผลลัพธ์นี้มีคุณสมบัติที่สะท้อนถึงช่วงเวลาสำหรับการชดเชย UTC กล่าวอีกนัยหนึ่ง มันอยู่ห่างจาก UTC แค่ไหน สำหรับ CET คือ 1:00:00 น. ฉันสามารถใช้เมธอด AddHours() เพื่อปรับค่าวันที่และเวลาได้

$remoteTime = $DateTime.AddHours( - ($tzone.BaseUtcOffset.totalhours))

นี่คือค่า UTC ที่ฉันสามารถแปลงเป็นเวลาท้องถิ่นของฉันได้แล้ว

$remoteTime.ToLocalTime()

ฉันอยู่ในเวลาตะวันออก ดังนั้นค่าชดเชย UTC ของฉันคือ -5 ชั่วโมง CET เกินกว่านั้นอีกหนึ่งชั่วโมง รวมเป็น 7 ชั่วโมง ดังนั้น 10:00 น. CET จึงเป็น 4:00 น. สำหรับฉันจริงๆ ฉันคิดว่าฉันอาจจะผ่านการประชุมครั้งนี้

แปลงเป็น LocalTime

ตอนนี้ฉันได้แก้ไขกลไกหลักแล้ว ฉันจะสรุปมันด้วยฟังก์ชัน PowerShell

Function ConvertTo-LocalTime {
    <#
    .Synopsis
    Convert a remote time to local time
    .Description
    You can use this command to convert datetime from another timezone to your local time. You should be able to enter the remote time using your local time and date format.
    .Parameter Time
    Specify the date and time from the other time zone.
    .Parameter TimeZone
    Select the corresponding time zone.
    .Example
    PS C:\> ConvertTo-LocalTime "2/2/2021 2:00PM" -TimeZone 'Central Europe Standard Time'

    Tuesday, February 2, 2021 8:00:00 AM

    Convert a Central Europe time to local time, which in this example is Eastern Standard Time.
    .Example
    PS C:\> ConvertTo-LocalTime "7/2/2021 2:00PM" -TimeZone 'Central Europe Standard Time' -Verbose
    VERBOSE: Converting Friday, July 2, 2021 2:00 PM [Central Europe Standard Time 01:00:00 UTC] to local time.
    Friday, July 2, 2021 9:00:00 AM

    The calculation should take day light savings time into account. Verbose output indicates the time zone and its UTC offset.

    .Notes
    Learn more about PowerShell: https://jdhitsolutions.com/blog/essential-powershell-resources/
    .Inputs
    None
    .Link
    Get-Date
    .Link
    Get-TimeZone
    #>
    [cmdletbinding()]
    [alias("ctlt")]
    [Outputtype([System.Datetime])]
    Param(
        [Parameter(Position = 0, Mandatory, HelpMessage = "Specify the date and time from the other time zone. ")]
        [ValidateNotNullorEmpty()]
        [alias("dt")]
        [string]$Time,
        [Parameter(Position = 1, Mandatory, HelpMessage = "Select the corresponding time zone.")]
        [alias("tz")]
        [string]$TimeZone
    )
    #parsing date from a string to accommodate cultural variations
    $ParsedDateTime = Get-Date $time
    $tzone = Get-TimeZone -Id $Timezone
    $datetime = "{0:f}" -f $parsedDateTime

    Write-Verbose "Converting $datetime [$($tzone.id) $($tzone.BaseUTCOffSet) UTC] to local time."

    $ParsedDateTime.AddHours(-($tzone.BaseUtcOffset.totalhours)).ToLocalTime()
}

ฟังก์ชันนี้ต้องการให้คุณระบุวันที่และเวลาและเขตเวลาที่เกี่ยวข้อง หากการทดสอบที่ฉันสามารถทำได้ คุณควรระบุวันที่โดยใช้รูปแบบวันที่และเวลาท้องถิ่นของคุณได้ นั่นเป็นสาเหตุที่พารามิเตอร์ Time เป็นสตริง และฉันกำลังเรียก Get-Date ฉันต้องแน่ใจว่าค่าที่แยกวิเคราะห์นั้นถูกต้องสำหรับวัฒนธรรมของคุณ โค้ดที่เหลือเป็นเพียงเวอร์ชันที่กะทัดรัดกว่าของสิ่งที่ฉันเพิ่งสาธิตไป

ตัวเติมโซนเวลา

เพื่อให้ใช้งานง่ายยิ่งขึ้น ฉันต้องการเติมค่าเขตเวลาที่เป็นไปได้ล่วงหน้า กล่าวอีกนัยหนึ่ง ให้เพิ่มการเติมข้อมูลอัตโนมัติ ในไฟล์เดียวกับฟังก์ชัน ฉันมีโค้ด PowerShell บิตนี้เพื่อตั้งค่าตัวทำให้อาร์กิวเมนต์สมบูรณ์

Register-ArgumentCompleter -CommandName ConvertTo-LocalTime -ParameterName TimeZone -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)

    #PowerShell code to populate $wordtoComplete
    (Get-TimeZone -ListAvailable | Sort-Object -Property ID).where({$_.id -match "$wordToComplete"}) |
        ForEach-Object {
            # completion text,listitem text,result type,Tooltip
            [System.Management.Automation.CompletionResult]::new("'$($_.id)'", "'$($_.id)'", 'ParameterValue', $_.BaseUtcOffset)
        }
}

รหัสใน scriptblock ถูกดำเนินการและเป็นสิ่งที่ให้ค่าความสมบูรณ์ คุณต้องเรียกใช้คำสั่งที่จะสร้างผลลัพธ์และแต่ละผลลัพธ์จะถูกเพิ่มเป็นออบเจ็กต์ CompletionResult ฉันกำลังแสดงค่าพารามิเตอร์สำหรับเมธอด New() เป็นความคิดเห็น

คุณยังมีตัวเลือกในการใช้พารามิเตอร์ $WordToComplete เป็นไวด์การ์ดประเภทหนึ่งอีกด้วย ในโค้ดของฉัน อาร์กิวเมนต์ที่สมบูรณ์จะได้รับรหัสเขตเวลาที่ชื่อตรงกับสิ่งที่ฉันพิมพ์ ซึ่งหมายความว่าฉันสามารถเริ่มพิมพ์ได้:

ConvertTo-LocalTime -Time "12/30/20 10:00AM" -TimeZone europe

และกด Ctrl+Space เพื่อเรียกใช้ PSReadline ซึ่งแสดงค่าที่เป็นไปได้ให้ฉันดู

01:00:00 ที่คุณเห็นคือค่า ToolTip ซึ่งเป็น BaseUTCOffset สิ่งนี้ดูดีกว่าเล็กน้อยใน PowerShell ISE

อย่างไรก็ตาม หากคุณพิมพ์ว่า:

ConvertTo-LocalTime -Time "12/30/20 10:00AM" -TimeZone 

จากนั้นกด Ctrl+Space PowerShell จะแจ้งให้คุณแสดงค่าที่เป็นไปได้ทั้งหมด 140 ค่า ฉันจะให้คุณลองด้วยตัวคุณเอง

ตอนนี้ฉันมีเครื่องมือ PowerShell ที่มีประโยชน์ซึ่งจะบอกฉันได้อย่างรวดเร็วว่าฉันต้องตื่นเช้าหรือนอนดึก

ฉันหวังว่าคุณจะลองใช้รหัสนี้และแจ้งให้เราทราบว่าคุณคิดอย่างไร ฉันสนใจเป็นพิเศษที่จะได้ยินว่ามันทำงานอย่างไรสำหรับผู้ที่ไม่มีวัฒนธรรมในอเมริกาเหนือ จากการทดสอบที่จำกัดของฉัน ฉันคิดว่า คุณสามารถป้อนวันที่เวลาโดยใช้วัฒนธรรมท้องถิ่นของคุณได้ และทุกอย่างควรจะเป็นไปตามที่คาดไว้ แต่ฉันชอบการยืนยัน

เรียนรู้และเพลิดเพลิน

บทความที่เกี่ยวข้อง