首页 > 解决方案 > 如何使用 powershell 将文件名上的时间戳转换为 UTC 格式?

问题描述

我有一堆包含数千个文件的文件夹,我从中生成一个仅包含文件名的 .csv 文件。这些文件名包含以下格式的时间戳:20180523040545689.

我想将 .csv 文件上的这些时间戳转换为 UTC 格式,如下所示:2018-05-23 T 04:05:45.689 TZ +01:00

这是我当前的 .csv 格式:

20180523040545689, 458796ZUx, WE25, 79peo

这是我想要获得的输出:

2018-05-23 T 04:05:45.689 TZ +01:00, 458796ZUx, WE25, 79peo

有没有办法使用 Powershell 脚本以快速简单的方式完成此任务?

更新:

我一直在测试@vonPryz 提供的脚本,它给了我以下错误:

Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."

我很确定这是单元格格式的问题,但我还不能解决它。

标签: powershelltime

解决方案


首先使用ParseExact()方法解析时间戳以获取 DateTime 对象。由于格式似乎是自定义格式,因此您需要告诉解析方法哪些部分是哪些部分。为此使用了格式字符串。要解决时区问题,请使用 InvariantCulture。像这样,

$dt = [datetime]::parseExact('20180523040545689', 'yyyyMMddHHmmssfff', [cultureinfo]::invariantCulture)

现在有了 DateTime 对象,调用 ToString()。内置o格式很接近,但不完全是。像这样,

$dt.ToString('o')
2018-05-23T04:05:45.6890000

如果这还不够好,请查看标准格式以获得更好的格式或使用解析部分中提到的自定义格式参考。

编辑

根据评论线程,这是一个示例解决方案

# Import the data
$data = Import-Csv C:\Temp\data.csv
# Peek the contents, for illustration purposes only
$data

col0              col1      col2 col3
----              ----      ---- ----
20180523040545689 458796ZUx WE25 76peo
20180524040545689 558796ZUx WE25 77peo
20180525040545689 658796ZUx WE25 78peo
20180526040545689 758796ZUx WE25 79peo

# Create a shorthand for invariant culture. Not strictly necessary, but makes things easier
$ci = [cultureinfo]::invariantCulture

# Loop through the data and change col0 contents.
# Tune the ToString() to provide suitable output
$data | % { $_.col0 = [datetime]::parseExact($_.col0, 'yyyyMMddHHmmssfff', $ci).ToString('o') }

# Show the modified content.
$data

col0                        col1      col2 col3
----                        ----      ---- ----
2018-05-23T04:05:45.6890000 458796ZUx WE25 76peo
2018-05-24T04:05:45.6890000 558796ZUx WE25 77peo
2018-05-25T04:05:45.6890000 658796ZUx WE25 78peo
2018-05-26T04:05:45.6890000 758796ZUx WE25 79peo

推荐阅读