Powershell 以微秒为单位的历元时间比较

Powershell 以微秒为单位的历元时间比较,powershell,datetime,datetime-format,epoch,Powershell,Datetime,Datetime Format,Epoch,我想在PowerShell里绕着大纪元转。基本上,我有一个CSV,它有一个以微秒为单位的历元时间列。我只想获取“昨天午夜和今天午夜UTC(但不包括今天午夜UTC)”范围内的记录 像这样的东西行吗?如何将日期时间转换为微秒?我只看到过几秒钟的帖子 $yesterdayMidnight = (Get-Date -Hour 0 -Minute 0 -Second 0).AddDays(-1) $todayMidnight = Get-Date -Hour 0 -Minute 0 -Second 0 I

我想在PowerShell里绕着大纪元转。基本上,我有一个CSV,它有一个以微秒为单位的历元时间列。我只想获取“昨天午夜和今天午夜UTC(但不包括今天午夜UTC)”范围内的记录

像这样的东西行吗?如何将日期时间转换为微秒?我只看到过几秒钟的帖子

$yesterdayMidnight = (Get-Date -Hour 0 -Minute 0 -Second 0).AddDays(-1)
$todayMidnight = Get-Date -Hour 0 -Minute 0 -Second 0
Import-Csv "Q:\data.csv" | ForEach-Object {
if (($_."Time-UTC-MicroSec" -le $yesterdayMidnight) -and ($_."Time-UTC-MicroSec" -lt $todayMidnight)) {
  # do stuff with records
}
示例文件:

ID1 ID2 ID3 Time-UTC-MicroSec 2080101 26 501032 1483232054547470 2080101 5 501032 1483231158598830 2080101 30 501012 1483230264931800 2080101 28 501032 1483230721849650 2080101 28 501032 1483231194379190 ID1 ID2 ID3时间UTC微秒 2080101 26 501032 1483232054547470 2080101 5 501032 1483231158598830 2080101 30 501012 1483230264931800 2080101 28 501032 1483230721849650
2080101 28 501032 148323119439190我从中获得了转换函数。首先,你只需要除以一百万就可以将微秒转换回秒

Function get-epochDate ($epochDate) { [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($epochDate))}

$yesterdayMidnight = (get-date -Hour 0 -Minute 0 -Second 0).AddDays(-1)
$todayMidnight = get-date -Hour 0 -Minute 0 -Second 0

Import-CSV "Q:\data.csv" | ForEach-Object {
    $dt = get-epochDate ([Double]($_."Time-UTC-MicroSec" / 1000000))
    if(($dt -ge $yesterdayMidnight) -and ($dt -lt $todayMidnight)) {
        #Do Stuff With Records
    }
}

为了获得正确的csv文件,我使用以下工具进行了转换:

$FileIn = "Q:\Test\2017-01\06\SO_41514002.csv"
(gc $FileIn) -replace " +",","|Set-Content .\Test.csv
我的方法是反过来把日期转换成秒

$FileIn = ".\Test.csv"
$unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
$UTCNow = [DateTime]::UtcNow
$TodMid = new-object DateTime $UTCNow.Year,$UTCNow.Month,$UTCNow.Day,0,0,0,([DateTimeKind]::Utc)
$YesMid = $TodMid.AddDays(-1)
$TodMidSec = [int]($TodMid - $unixEpochStart).TotalSeconds
$YesMidSec = [int]($YesMid - $unixEpochStart).TotalSeconds

Import-CSV $FileIN | ForEach-Object {
    $dt = [int]($_."Time-UTC-MicroSec" / 1000000)
    "$YesMidSec $dt $TodMidSec"
    if(($dt -ge $yesMidsec) -and ($dt -lt $todMidsec)) {
    "in range"
    }
}
脚本的输出显示秒数刚刚超出范围:

> .\SO_41514002.ps1
1483574400 1483232055 1483660800
1483574400 1483231159 1483660800
1483574400 1483230265 1483660800
1483574400 1483230722 1483660800
1483574400 1483231194 1483660800

比较是当地时间午夜还是utc时间?对于微秒,只需乘以/除以10e5。应为UTC午夜。舍入是否有任何问题?(对不起,我数学不太好。)比如说,如果是11:59 999999 XXX微秒,我把它转换成秒,那会一直到午夜吗?我希望那张唱片能保留下来。@esurience好问题!这里不涉及四舍五入。您只需除以1000000即可转换为秒,因为powershell中没有DateTime的addMicroseconds函数,只有addSeconds和AddMilliconds。该数字被强制转换为双精度,以确保保持准确性。与大多数情况不同,PowerShell默认情况下舍入为最接近的整数。@DonCruickshank我相信,您所指的行为仅发生在除以的值的原始数据类型已经是整数的情况下,并且您没有具体说明数据类型。在这种情况下,这种情况永远不会发生。