我正在使用 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)
请参阅 将 Unix 时间戳转换为 .NET DateTime。
您可以在 PowerShell 中轻松重现此内容。
$origin = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0
$whatIWant = $origin.AddSeconds($unixTime)
用途:
(([System.DateTimeOffset]::FromUnixTimeSeconds($unixTime)).DateTime).ToString("s")
FromUnixTimeMilliseconds
也可以。
ToString("s"):可排序:“该模式反映了定义的标准 (ISO 8601)”
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.
$date = get-date "1/1/1970"
$date.AddSeconds($unixTime).ToLocalTime()
简单的一句台词:
(Get-Date "1970-01-01 00:00:00.000Z") + ([TimeSpan]::FromSeconds($unixTime))
没有带来任何新内容,而是 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
$ctime = $entry.created
[datetime]$origin = '1970-01-01 00:00:00'
$origin.AddSeconds($ctime)
我想确保我是根据 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)
我发现建议的解决方案都没有解决我的需求。所以我调整并提出以下建议:
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
我尝试的所有操作都返回一个错误,指出 unix 日期“超出范围”。这最终对我有用:
PS> get-date 1681343082548 -UFormat "%A %m/%d/%Y %T %Z"
Tuesday 01/02/0001 22:42:14 -06
unix 时间附近根本没有引号。
我知道这是一个非常老的问题,但只是想分享一下 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