【问题标题】:Format a datetime in PowerShell to JSON as \/Date(1411704000000)\/将 PowerShell 中的日期时间格式化为 JSON 为 \/Date(1411704000000)\/
【发布时间】:2014-09-26 20:37:20
【问题描述】:

我想获取当前日期为以下格式的字符串:

\/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 序列化程序。

【问题讨论】:

  • 我对 JSON 一无所知,这就是为什么这只是一个评论,但我使用字符串操作来获取您正在寻找的输出 (Get-Date | Select-Object -Property Date | ConvertTo-Json).Split('"') | Where-Object{$_ -match "\\"}。它很脏,但在引号中拆分为数组,并用反斜杠匹配数组项(2,因为它需要在正则表达式中转义。)\/Date(1411704000000)\/

标签: .net datetime powershell


【解决方案1】:

这里有两个问题属性,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】:

所以,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 的开始时间。

【讨论】:

  • 谢谢。这确实有效,但与其他答案相比,我在转换和包装“Date()”字符串方面有更多工作要做。
  • 这是您将其转换回来的方式吗? $utc = (get-date '1/1/1970') + [timespan]::frommilliseconds($jdate); $utc = [datetime]::SpecifyKind($utc,'utc'); $utc.ToLocalTime() 注意 convertfrom-json 返回 utc 时间。
  • 如果您想在 java 脚本中使用 json,这是更好的选择。这个的输出可以进入js的new Date()
  • 真正的问题是没有像 JSON 日期这样的东西。 JSON 规范没有日期类型。欢迎每个实现使用自己的方法。微软选择了这种方式,几乎所有其他人都使用 ISO-8601 格式的字符串日期。
【解决方案3】:

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

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

例子:

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

返回:

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

【讨论】:

  • 那个 json 日期格式有问题,甚至 convertfrom-json 也不能正确转换回来。 Powershell 6 以不同的方式将日期时间转换为 json。
猜你喜欢
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多