В PowerShell, как я могу преобразовать строку DateTime в сумму секунд?
В PowerShell, как мне преобразовать DateTime в UNIX?
Ответ 1
PS H:\> (New-TimeSpan -Start $date1 -End $date2).TotalSeconds
1289923177.87462
New-TimeSpan может быть использован для этого. Например,
$date1 = Get-Date -Date "01/01/1970"
$date2 = Get-Date
(New-TimeSpan -Start $date1 -End $date2).TotalSeconds
Или просто используйте эту однострочную команду
(New-TimeSpan -Start (Get-Date "01/01/1970") -End (Get-Date)).TotalSeconds
Ответ 2
Как уже упоминалось, эпоха UNIX - 1 января 1970 года в 12:00 (полночь) UTC. Чтобы получить текущую секундную-в-эпоху в UTC в целом номере, я использую этот 80-символьный однострочный
$ED=[Math]::Floor([decimal](Get-Date(Get-Date).ToUniversalTime()-uformat "%s"))
Приведенный выше код совместим с PowerShell 2.0 и округляет его (для обеспечения согласованного поведения с UNIX)
Ответ 3
С .NET Framework 4.6 вы можете использовать ToUnixTimeSeconds
метод DateTimeOffset
class:
[DateTimeOffset]::Now.ToUnixTimeSeconds()
$DateTime = Get-Date #or any other command to get DateTime object
([DateTimeOffset]$DateTime).ToUnixTimeSeconds()
Ответ 4
Этот однострочный файл работает для меня (сравнил его с http://www.unixtimestamp.com/)
[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalSeconds
В течение миллисекунд
[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalMilliseconds
Ответ 5
Чтобы получить секунды с 1970 года независимо от часового пояса, я бы пошел с:
$unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
[int]([DateTime]::UtcNow - $unixEpochStart).TotalSeconds
Ответ 6
Я просто хотел представить еще один, и, надеюсь, более простой способ решить эту проблему. Вот один вкладыш, который я использовал для получения текущего времени Unix (эпоха) в UTC:
$unixTime = [long] (Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s)
Разрушая это изнутри:
(Get-Date).ToUniversalTime()
Получает текущую дату/время в часовом поясе UTC. Если вы хотите по местному времени, просто позвоните в Get-Date. Затем он используется как вход для...
[long] (Дата-дата-дата (дата/время UTC сверху) -UFormat% s)
Преобразование даты/времени UTC (с первого шага) в формат Unix. -UFormat% s сообщает Get-Date, чтобы вернуть результат как время эпохи Unix (секунды, прошедшие с 01 января 1970 года 00:00:00). Обратите внимание, что это возвращает двойной тип данных (в основном десятичный). Бросив его на длинный тип данных, он автоматически преобразуется (округляется) в 64-разрядное целое (без десятичной). Если вам нужна дополнительная точность десятичной дроби, не отбрасывайте ее на длинный тип.
Дополнительный кредит
Другой способ конвертировать/округлять десятичное число до целого числа - использовать System.Math:
[System.Math]::Round(1485447337.45246)
Ответ 7
Powershell
$epoch = (Get-Date -Date ((Get-Date).DateTime) -UFormat %s)
Ответ 8
Я предлагаю следующее, основанное на тиках (Int64), а не секундах (Int32), чтобы избежать проблемы 2038 года. [Math]:: Floor используется, поскольку время Unix основано на количестве целых секунд с момента эпохи.
[long][Math]::Floor((($DateTime.ToUniversalTime() - (New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc))).Ticks / [timespan]::TicksPerSecond))
Ответ 9
Здесь script, который преобразует как TO, так и FROM CTIME, которые я использовал некоторое время (дольше, потому что он был написан для толпы типа "новый для сценариев" с различными комментариями.
# Here a very quick variant to 'get the job done'
[Int]$ctime=1472641743
[datetime]$epoch = '1970-01-01 00:00:00'
[datetime]$result = $epoch.AddSeconds($Ctime)
write-host $result
# A few example values for you to play with:
# 1290100140 should become ... 2010-11-18 17:09:00.000
# 1457364722 should become ... 2016-03-07 15:32:02.000
# 1472641743 should become ... 31/08/2016 11:09:03
# For repeated use / calculations, functions may be preferable. Here they are.
# FROM C-time converter function
# Simple function to convert FROM Unix/Ctime into EPOCH / "friendly" time
function ConvertFromCtime ([Int]$ctime) {
[datetime]$epoch = '1970-01-01 00:00:00'
[datetime]$result = $epoch.AddSeconds($Ctime)
return $result
}
# INTO C-time converter function
# Simple function to convert into FROM EPOCH / "friendly" into Unix/Ctime, which the Inventory Service uses.
function ConvertToCTime ([datetime]$InputEpoch) {
[datetime]$Epoch = '1970-01-01 00:00:00'
[int]$Ctime = ""
$Ctime = (New-TimeSpan -Start $Epoch -End $InputEpoch).TotalSeconds
return $Ctime
}
Надеюсь, что это поможет, особенно если вы просто хотите что-то более дружелюбное для начинающих или так:).
Ответ 10
Ниже cmdlet преобразует время безотказной работы Windows в формат понятной эпохи Unix:
$s=Get-WmiObject win32_operatingsystem | select csname,@{LABEL='LastBootUpTime';EXPRESSION{$_.ConverttoDateTime($_.lastbootuptime)}};
[Math]::Floor([decimal](Get-Date($s.LastBootUpTime.ToUniversalTime()).ToUniversalTime()-uformat "%s"))
Ответ 11
Снова по сравнению с http://www.unixtimestamp.com и построим на других выше
$date1 = (Get-Date -Date "01/01/1970").ToUniversalTime()
$date2 = (Get-Date).ToUniversalTime()
$epochTime = [Math]::Floor((New-TimeSpan -Start $date1 -End $date2).TotalSeconds)
Ответ 12
Этот должен также работать, поскольку javascript использует миллисекунды с эпохи:
ConvertTo-Json (Get-Date) | ? { $_ -Match '\(([0-9]+)\)' } | % { $Matches[1]/1000 }
Шаг за шагом:
PS P:\> Get-Date
lundi 15 janvier 2018 15:12:22
PS P:\> ConvertTo-Json (Get-Date)
{
"value": "\/Date(1516025550690)\/",
"DisplayHint": 2,
"DateTime": "lundi 15 janvier 2018 15:12:30"
}
PS P:\> (ConvertTo-Json (Get-Date)) -Match '\(([0-9]+)\)'
True
PS P:\> $Matches
Name Value
---- -----
1 1516025613718
0 (1516025613718)
Ответ 13
не уверен, когда -uformat был добавлен к get-date, но он позволяет вам использовать строки формата даты Unix;
[int64](get-date -uformat %s)
Ответ 14
Вы можете использовать параметр Uformat get-date. Но сначала я хотел бы убедиться, что дата данной рабочей станции правильная (я считаю, что рабочая станция подключена к сети компании, в которой есть сервер с правильным установленным временем).
#Synchronize workstation time with server
cmd /c "sc config w32time start= auto"
cmd /c "w32tm /unregister"
cmd /c "w32tm /register"
cmd /c "net start w32time"
cmd /c 'tzutil.exe /s "W. Europe Standard Time"'
cmd /c 'reg add "HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v DisableAutoDaylightTimeSet /t REG_DWORD /d 0 /f'
cmd /c "net time \\full-servername.ru /set /yes"
Затем я получаю фактическую временную метку Unix для сравнения объектов (учетных записей) между фактической датой и датой создания (задачи удаления учетной записи, когда временная метка Unix превышает предельную дату)
#Get actual unix timestamp and compare it to something
$actual_date = (get-date -UFormat "%s")
$final_date = "some unix date of the database"
if(($final_date - $actual_date) -lt 0 ){
#make deletion task
}