如何在PowerShell中将ISO时间字符串转换为datetime2(7)格式?
解决PowerShell中ISO时间转datetime2(7)格式的问题
首先,你的方向是对的,datetime2(7)要求的格式确实是yyyy-MM-dd HH:mm:ss.fffffff(精确到7位小数的秒),但需要注意输入的UTC时间字符串(带Z后缀)的解析和时区处理,这是容易踩坑的点。
分两种场景处理:
1. 需要保留UTC时间(和输入的Z时间一致)
输入的2020-08-19T08:00:53.643Z是UTC时间,默认情况下Get-Date会将其转换为你的本地时区时间。如果要保持UTC的时间值,需要显式转为UTC后再格式化:
$temp = "2020-08-19T08:00:53.643Z" # 解析为DateTime对象后转UTC,再按指定格式输出 $lastExecutedTime = (Get-Date $temp).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss.fffffff")
或者更简洁的PowerShell写法:
$lastExecutedTime = Get-Date $temp -Utc | Get-Date -Format "yyyy-MM-dd HH:mm:ss.fffffff"
输出结果会是:2020-08-19 08:00:53.6430000(自动补全7位小数,符合datetime2(7)要求)。
2. 需要转换为本地时区时间
如果你的业务需要将UTC时间转成本地时间,那你原来的代码基本可以用,但建议先确认解析是否正确(PowerShell对ISO 8601格式的支持很友好):
$temp = "2020-08-19T08:00:53.643Z" $lastExecutedTime = Get-Date $temp -Format "yyyy-MM-dd HH:mm:ss.fffffff"
比如你的本地时区是东八区(北京时间),输出会是2020-08-19 16:00:53.6430000,这也是符合datetime2(7)格式的。
关键注意点:
- 输入的
Z后缀代表UTC时间,Get-Date默认会做时区转换,所以一定要根据业务需求选择是否保留UTC。 - 格式字符串中的
fffffff对应7位小数,即使输入只有3位毫秒(比如.643),PowerShell会自动补零到7位,完全满足datetime2(7)的精度要求。
内容的提问来源于stack exchange,提问作者Rajendar Talatam US - IFS
相关产品推荐
相关产品推荐

