将PowerShell中的日期时间格式化为JSON格式为\ / Date(1411704000000)\ /

时间:2014-09-26 20:37:21

标签: .net datetime powershell

我希望以下列格式将当前日期作为字符串获取:

\/Date(1411762618805)\/

我一直在与PowerShell斗争,并尝试了以下方法,但它不断地用不需要的属性包装对象。我只需要value

Get-Date | ConvertTo-Json
# returns
{
  "value":  "\/Date(1411762618805)\/",
  "DisplayHint":  2,
  "DateTime":  "Friday, September 26, 2014 4:16:58 PM"
}

当然,如果您尝试使用ConvertFrom-Json转换回对象,则返回.NET Date对象。

我已经接近了

Get-Date | Select-Object -Property Date | ConvertTo-Json
{
  "Date":  "\/Date(1411704000000)\/"
}

但它仍然包含在Date子属性中。在一天结束时,我想要的是一个带有微软丑陋JSON格式的字符串

我只想尽可能使用内置的.NET JSON序列化程序。

3 个答案:

答案 0 :(得分:6)

所以,关于JSON日期的精彩之处在于......什么都没有。他们是邪恶的,应该受到惩罚。

那么,什么是JSON日期?这是自Unix Epoc(1970年1月1日)以来的毫秒数,也就是UTC时间。所以,这很好,但是如何在不使用ConvertTo-JSON cmdlet的情况下实现这一目标?我知道的最简单方法是:

[int64]([datetime]::UtcNow)-(get-date "1/1/1970").TotalMilliseconds

这将为您提供为JSON格式化的当前日期和时间。如果你想要一个特定的日期或日期/时间你可以做,但你必须调整时区,我们可以做,它只是变得很长:

$target = "2/2/2014 6:32 PM"
[int64]((get-date $target).addhours((([datetime]::UtcNow)-(get-date)).Hours)-(get-date "1/1/1970")).totalmilliseconds
1391391120000

这将是最后Super Bowl的启动时间。

答案 1 :(得分:6)

这里有两个问题属性,DateTime和DisplayHint,两者都需要不同的解决方案。 DateTime属性是由扩展类型系统附加的ScriptProperty,因此它自动存在于所有DateTime对象上。您可以通过Remove-TypeData

将其从当前会话中的所有DateTime对象中删除
Get-TypeData System.DateTime | Remove-TypeData

DisplayHint属性是由Get-Date cmdlet添加的NoteProperty。我知道没有办法从序列化中抑制这种情况。您可以从DateTime显式删除它:

Get-Date | foreach { $_.PSObject.Properties.Remove("DisplayHint"); $_ } | ConvertTo-Json

将输出

"\/Date(1411846057456)\/"

这是当前的日期和时间,如果您只想要这样做的日期

Get-Date | select -ExpandProperty Date | ConvertTo-Json

此处我们不必删除DisplayHint,因为它没有被Get-Date附加。

甚至不让我开始你必须跳过的篮球转换回正确的日期时间对象。

答案 2 :(得分:0)

我知道这已经过时了但谷歌却把我带到了这里。我正在使用Invoke-RestMethod发送/接收JSON数据,包括/ Date(1411704000000)/格式的时间戳。我设法使用以下内容从PowerShell转换为JSON:

[System.DateTime]$(Get-Date).DateTime

示例:

@{DateTime = [System.DateTime]$(Get-Date).DateTime} | ConvertTo-Json

返回:

{
    "DateTime":  "\/Date(1484023637000)\/"
}