在Powershell中格式化不同时区的时间/日期

时间:2019-05-31 01:47:45

标签: powershell timezone

我需要使用Powershell将UTC时间/日期输出转换为ISO 8601(或类似格式)的东部标准时间,以便在DOS Batch文件中使用。

我对Powershell的经验很少,但是以前已经为各种DOS批处理文件修改了现有的Powershell命令。 Powershell可以轻松地从多个时区输出时间/日期,但是尚不清楚它是否可以随时以数字格式显示该输出。

在DOS批处理文件中,可以调用Powershell以这种格式显示UTC时间-

echo | powershell (get-date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ss')

我需要调用其他时区,但输出为'FullDateTimePattern',其拼写为-

echo | Powershell [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time')

我希望以前的命令可以(以某种方式)合并在一起,或者希望将“ Get-Date -format”说明符之一应用于第二个代码示例,或者希望将偏移值应用于UTC时间/日期输出,或者是否可以将其他一些简单的代码解决方案(或实用程序)整合到DOS批处理文件中。

2 个答案:

答案 0 :(得分:1)

To convert the current UTC [datetime] instant to Eastern Standard Time with the specified format:

powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([datetime]::UtcNow, 'Eastern Standard Time').ToString('yyyy-MM-ddTHH:mm:ss')"

Note the following additional improvements:

  • No need for echo |: When PowerShell is invoked with a command with (possibly implied) -Command / -c, it automatically exits after completing that command. (As an aside, echo | doesn't send just a newline, it sends the string ECHO is on., followed by a newline; to send just a newline, you'd have to use echo. |

  • Option -c (-Command) is used explicitly, not just to make the intent clearer, but also to ease potential later transition to PowerShell Core, where -Command is no longer the default (-File is).

  • While your specific command would work without the enclosing double quotes ("..."), it's generally better to use them, so that commands that include cmd.exe metacharacter - e.g., & - don't break.

答案 1 :(得分:0)

非常感谢您的答复。我注意到有人可以通过这种方式将记录在案的Microsoft Get-Date格式说明符应用于时区(鉴于我缺乏Powershell经验,这并不明显)。

在最宽的传播时区中测试大多数这些选项可能会有所帮助。

日期标准时间[(UTC-12:00)国际日期变更线西]
莱恩群岛标准时间[(UTC + 14:00)基里蒂马蒂岛]

以下代码于2019年6月1日(星期六)东部标准时间下午1点运行,以转换为Line Islands标准时间(UTC + 14:00)

ShortDatePattern:相当于Get-Date -format d

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('d')"

6/2/2019

LongDatePattern:相当于Get-Date -format D

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('D')"

2019年6月2日,星期日

完整日期和时间(长日期和短时间):等效Get-Date -format f

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('f')"

2019年6月2日星期日上午7:01

FullDateTimePattern(长日期和长时间):相当于Get-Date -format F

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('F')"

2019年6月2日,星期日,上午7:01:23

常规(短日期和短时间):等同于Get-Date -format g

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('g')"

2019/6/2上午7:01

常规(短日期和长时间):相当于Get-Date -format G

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('G')"

2019/6/2上午7:01:25

MonthDayPattern:相当于Get-Date -format mGet-Date -format M

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('m')"

6月2日

往返日期/时间模式:相当于Get-Date -format o

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('o')"

2019-06-02T07:01:27.8492082

RFC1123模式:等同于Get-Date -format rGet-Date -format R

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('r')"

Sun,02 Jun 2019 07:01:28 GMT

使用本地时间的SortableDateTimePattern(基于ISO 8601):相当于Get-Date -format s

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('s')"

2019-06-02T07:01:29

ShortTimePattern:相当于Get-Date -format t

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('t')"

7:01 AM

LongTimePattern:相当于Get-Date -format T

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('T')"

7:01:32 AM

UniversalSortableDateTimePattern使用通用时间显示格式:Get-Date -format u等效

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('u')"

2019-06-02 07:01:33Z

使用通用时间的完整日期和时间(长日期和长时间):相当于Get-Date -format U

将此选项应用于任何时区(UTC除外)似乎都会产生+4:00的偏移量,这可能是有问题的。

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('U')"

2019年6月2日,星期日,11:01:34 AM

YearMonthPattern:相当于Get-Date -format yGet-Date -format Y

Powershell.exe -c "[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'Line Islands Standard Time').ToString('y')"

2019年6月