2012-05-07 6 views
18

Tôi đang cố gắng tạo một đối tượng DateTime với dấu thời gian UTC cụ thể trong PowerShell. Cách đơn giản nhất để làm điều này là gì?Tạo một đối tượng DateTime với một Ngày giờ UTC cụ thể trong PowerShell

tôi đã cố gắng:

Get-Date 
    -Format (Get-Culture).DateTimeFormat.UniversalSortableDateTimePattern 
    -Date "1970-01-01 00:00:00Z" 

nhưng tôi nhận ra điều này:

1969-12-31 19:00:00Z 

Đó là một vài giờ tắt. Trường hợp của tôi mất hiệu lực trong sự hiểu biết?

Trả lời

22

Chính đối tượng DateTime đang được tạo với thời gian UTC phù hợp. Nhưng khi PowerShell in ra, nó chuyển đổi nó thành văn hóa và múi giờ địa phương của tôi, do đó sự khác biệt.

Proof:

$UtcTime = Get-Date -Date "1970-01-01 00:00:00Z" 
$UtcTime.ToUniversalTime() 
+1

phản bác: $ UtcTime.Kind Ý tôi là, khi bạn vượt qua nó để một số chức năng khác - trong nhiều trường hợp nó sẽ đối xử với nó như là một giờ địa phương, bởi vì đây là những gì thực sự được lưu trữ. Và PowerShell không chuyển đổi nó thành thời gian cục bộ của bạn khi in ... Nếu không ToUniversalTime() của bạn cũng sẽ là địa phương –

+2

'Get-Date' chuyển đổi thời gian UTC đã cho thành cục bộ và lưu nó thành đối tượng' datetime' với 'Kind 'được đặt thành' Địa phương'. Nó lưu trữ đúng điểm vật lý đúng lúc, nhưng đó là thời gian địa phương và sẽ được in theo giờ địa phương. Lưu ý rằng đây vẫn là câu trả lời đúng cho câu hỏi. OP không yêu cầu cụ thể việc tạo một đối tượng 'datetime' với loại UTC. Được thăng hạng. –

0

Đây là cách nó hoạt động trong .NET, phải không? PowerShell chỉ cần gọi phương thức ToUniversalTime. Từ http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx

The Coordinated Universal Time (UTC) is equal to the local time minus the 
UTC offset. For more information about the UTC offset, see TimeZone.GetUtcOffset. 
The conversion also takes into account the daylight saving time rule that applies 
to the time represented by the current DateTime object. 
14
(get-date).ToUniversalTime().ToString("yyyyMMddTHHmmssfffffffZ") 
+2

Giá trị ToString phải hỗ trợ 24 giờ, vì vậy nó phải có vốn HH: '.ToString (" yyyyMMddTHHmmssfffffffZ ")' ví dụ. 02:00:00 PM nên trở thành ..140000 kể từ UTC là timezone-agnostic –

+0

Điều này làm việc tuyệt vời! 'PowerShell -NoProfile -ExecutionPolicy Bypass -Command" ((get-date) .ToUniversalTime()). ToString (\ "yyyy-MM-ddTHH: mm: ss + 0000 \") " –

1
$utctime = New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc) 

Nếu bạn in ra $utctime, sau đó bạn nhận được:

1. januar 1970 00:00:00 

Ngoài ra, $utctime.Kind được thiết lập một cách chính xác để Utc.

1
$time = [DateTime]::UtcNow | get-date -Format "yyyy-MM-ddTHH:mm:ssZ" 

Điều này dường như cũng làm việc