关于datetime:在Powershell中确定不同时区的夏令时状态

Determine Daylight Savings status for different time zone in Powershell

在PowerShell中是否有一种灵巧的方式来确定另一个时区的过去日期是否为夏令时? 这是情况,我们的数据库在欧洲,时间和日期是该服务器的本地。 由于欧洲和美国在不同时间开始和停止夏令时,我需要考虑那些时间的小时差异。
谢谢你的建议。


无需尝试确定DST是否有效。只需让.NET Framework为您进行转换。

首先,确定要转换的时区ID。

你说你的输入时间是在欧洲,但你没有具体指明在哪里。与美国一样,欧洲也有多个时区。我假设你的意思是CET / CEST(UTC + 1 / + 2)。在Windows中,您可以使用以下任何标识符:

  • "Central Europe Standard Time"
  • "Central European Standard Time"
  • "Romance Standard Time"(为什么?谁知道。)
  • "W. Europe Standard Time"(不要被名字所迷惑,它仍然是中心)

除了显示名称外,它们都是相同的(在Windows中)。如果您想要精确选择哪一个,请参阅CLDR参考。

对于美国中部时区,请使用"Central Standard Time"

然后只需使用TimeZoneInfo.ConvertTimeBySystemTimeZoneId函数,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
# collect your input (through db, or whatever mechanism you have)
$inputDateTime = Get-Date -Date"2017-06-27 00:00:00"

# pick your time zones
$fromTimeZone ="Central Europe Standard Time"  # EU
$toTimeZone ="Central Standard Time"           # USA

# convert
$outputDateTime = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId(
  $inputDateTime, $fromTimeZone, $toTimeZone)

# output
Write-Output $outputDateTime


科尔,我喜欢这种灵感,因为你的反应是一根针插在干草中,正是我所需要的。但是,它产生了一个错误。经过一番乱搞,我得到以下工作:

1
$isDST = ([System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time"))).IsDaylightSavingTime()

(在PowerShell v4中)


我知道这是一个较老的线程,但我实际上需要能够确定它是否是当前的DST。我们有一台服务器,其本地TZ设置为UTC(没有看到DST),并且具有自动化功能,需要能够知道当地时间下午4点。因此脚本全部是UTC,但我可以根据此野兽的结果值添加一小时或不小时:

1
2
3
4
$DST = ([System.TimeZoneInfo]::ConvertTimeFromUtc(
    (get-date).ToString(),
    [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time")
)).isdaylightsavingtime()