使用 PowerShell 转换 Unix 时间

问题描述 投票:0回答:12

我正在使用 PowerShell SQLite 模块解析 SQLite 数据库,并创建和修改了几个返回值,这两个值都是 Unix 时间的。

我想做的是以某种方式将其转换为“人类时间”。为了便于阅读,我删除了一些其他 SQL 查询。

Import-Module SQLite
mount-sqlite -name GoogleDrive -dataSource E:\Programming\new.db
$cloud_entry = Get-ChildItem GoogleDrive:\cloud_entry

foreach ($entry in $cloud_entry)
{
    $entry.created
}

输出看起来像一大列 Unix 时间戳:

1337329458

更新:我最终选择了以下内容:

$ctime = $entry.created
[datetime]$origin = '1970-01-01 00:00:00'
$origin.AddSeconds($ctime)
powershell epoch unix-timestamp
12个回答
31
投票

请参阅 将 Unix 时间戳转换为 .NET DateTime

您可以在 PowerShell 中轻松重现此内容。

$origin = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0
$whatIWant = $origin.AddSeconds($unixTime)

23
投票

用途:

(([System.DateTimeOffset]::FromUnixTimeSeconds($unixTime)).DateTime).ToString("s")

FromUnixTimeMilliseconds
也可以。

ToString("s"):可排序:“该模式反映了定义的标准 (ISO 8601)”

参考:标准日期和时间格式字符串,可排序(“s”)格式说明符


19
投票
Function Convert-FromUnixDate ($UnixDate) {
   [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($UnixDate))
}

$niceTime = Convert-FromUnixDate $ctime

PS C:\> $niceTime

Friday, 18 May 2012 8:24:18 p.m.

8
投票
$date = get-date "1/1/1970"
$date.AddSeconds($unixTime).ToLocalTime()

4
投票

简单的一句台词:

(Get-Date "1970-01-01 00:00:00.000Z") + ([TimeSpan]::FromSeconds($unixTime))

4
投票

没有带来任何新内容,而是 Fredrics 答案的可管道版本:

function epoch() { 
    Param( 
        [Parameter(ValueFromPipeline)]$epochTime,
        [Switch]$Ms
    ) 
    Process { 
        if ($Ms) {
            [System.DateTimeOffset]::FromUnixTimeMilliseconds($epochTime)
        } else {
            [System.DateTimeOffset]::FromUnixTimeSeconds($epochTime)
        }
    } 
}
"1628043561861" | epoch -Ms

DateTime      : 04.08.2021 02:19:21
UtcDateTime   : 04.08.2021 02:19:21
LocalDateTime : 04.08.2021 04:19:21
Date          : 04.08.2021 00:00:00
Day           : 4
DayOfWeek     : Wednesday
DayOfYear     : 216
Hour          : 2
Millisecond   : 861
Minute        : 19
Month         : 8
Offset        : 00:00:00
Second        : 21
Ticks         : 637636403618610000
UtcTicks      : 637636403618610000
TimeOfDay     : 02:19:21.8610000
Year          : 2021

1
投票
$ctime = $entry.created
[datetime]$origin = '1970-01-01 00:00:00'
$origin.AddSeconds($ctime)

1
投票

我想确保我是根据 UTC 计算的,所以我添加了

SpecifyKind
:

$epochStart = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0
$epochStart = [DateTime]::SpecifyKind($epochStart,[DateTimeKind]::Utc)

$DateTimeUTC = $epochStart.AddSeconds($UnixTimestamp)

1
投票

我发现建议的解决方案都没有解决我的需求。所以我调整并提出以下建议:

function ConvertFrom-UnixTime {
    [CmdletBinding(DefaultParameterSetName = "Seconds")]
    param (
        [Parameter(Position = 0, 
            ValueFromPipeline = $true, 
            Mandatory = $true,
            ParameterSetName = "Seconds")]
        [int]
        $Seconds,

        [Parameter(Position = 0, 
            ValueFromPipeline = $true, 
            Mandatory = $true, ParameterSetName = "Miliseconds")]
        [bigint]
        $Miliseconds
    )
    Begin {
        $date = (Get-Date "1970-01-01 00:00:00.000Z")
    }
    Process {
        switch ($PSCmdlet.ParameterSetName) {
            "Miliseconds" {
                $date = $date.AddMilliseconds($Miliseconds)
            }
            Default {
                $date = $date.AddSeconds($Seconds);
            }
        }
    }
    End {
        $date
    }
}
Set-Alias -Name epoch -Value ConvertFrom-UnixTime

用途:

1633694244| epoch
1633694244565 | epoch

两个输出:

8. oktober 2021 12:57:24

0
投票

我尝试的所有操作都返回一个错误,指出 unix 日期“超出范围”。这最终对我有用:

PS> get-date 1681343082548 -UFormat "%A %m/%d/%Y %T %Z"

Tuesday 01/02/0001 22:42:14 -06

unix 时间附近根本没有引号。


0
投票

PowerShell 7 中的 DateTime 类型定义了静态 UnixEpoch 值,因此现在可以更简洁地完成此操作:

[DateTime]::UnixEpoch.AddSeconds($unixTime)

注意:这是在.NET Core 2.1中引入的,所以我相信它适用于自6.1以来的PowerShell版本。


0
投票

我知道这是一个非常老的问题,但只是想分享一下 Powershell 7 的

Get-Date
现在对转换 Unix 时间具有本机支持(由于这个问题,我发现了这一点)。默认情况下,它会将其转换为当地时间。

PS> Get-Date -UnixTimeSeconds 1338194440

Monday, May 28, 2012 4:40:40 AM

PS> (Get-Date -UnixTimeSeconds 1338194440).Kind

Local

如果您想要 UTC 格式,只需将

-AsUTC
添加到命令中即可。

PS> Get-Date -UnixTimeSeconds 1338194440 -AsUTC

Monday, May 28, 2012 8:40:40 AM

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-7.3#example-9-convert-a-unix-timestamp

© www.soinside.com 2019 - 2024. All rights reserved.