2017-01-06 4 views
1

Я пытаюсь обернуть голову вокруг Epoch time в PowerShell. В принципе, у меня есть CSV, у которого есть столбец с временем Epoch в микросекундах. Я хочу захватить только записи, которые попадают в «вчера полночь и сегодня полуночный UTC (но не включая сегодня полуночный UTC»).Сравнение времени Epoch в микросекундах

Будет ли что-то вроде этой работы? Как вы конвертируете дату и время в микросекунды? Я видел только сообщения о секундах ..

$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
+0

Проводится ли сравнение с местным временем в полночь или с utc? Для микросекунд просто умножьте/разделите с/на 10e5. – LotPings

+0

Должно быть Midnight UTC. – Esuriency

ответ

2

Я получил функцию преобразования из here. Сначала вам просто нужно разделить на миллион, чтобы преобразовать микросекунды обратно в секунды.

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 
    } 
} 
+0

Будут ли проблемы с округлением? (Извините, я не очень хорош в математике.) Как если бы это было 11:59 99999xxx в микросекундах, и я конвертирую это в секунды, это будет до полуночи? Я бы хотел, чтобы эта запись осталась. – Esuriency

+0

@ Уверенность Хороший вопрос! Здесь нет округления. Вам нужно делить на 1 000 000, чтобы конвертировать в секунды, потому что там нет функции addMicroseconds для DateTime в powershell, просто addSeconds и addMilliseconds. Число передается в двойное, чтобы обеспечить точность. – Cole9350

+0

PowerShell, в отличие от большинства вещей, по умолчанию округляет до ближайшего целого. –

0

Чтобы получить правильный 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 
Смежные вопросы