PowerShell에서 DateTime을 UNIX 시간으로 변환하려면 어떻게 해야 합니까?
PowerShell에서 DateTime 문자열을 초 단위로 변환하려면 어떻게 해야 합니까?
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
.NET Framework 4.6을 사용하면 다음 방법을 사용할 수 있습니다.DateTimeOffset
삭제:
[DateTimeOffset]::Now.ToUnixTimeSeconds()
$DateTime = Get-Date #or any other command to get DateTime object
([DateTimeOffset]$DateTime).ToUnixTimeSeconds()
언급한 바와 같이 UNIX Epoch는 1970년 1월 1일 오전 12:00(자정) UTC입니다. UTC에서 에포크 이후의 현재 시간을 정수로 얻으려면 이 80자 원라이너를 사용합니다.
$ED=[Math]::Floor([decimal](Get-Date(Get-Date).ToUniversalTime()-uformat "%s"))
위의 코드는 PowerShell 2.0 호환 및 라운드다운(UNIX와의 일관된 동작 보장)
언제인지 확실하지 않습니다.-UFormat
에 추가되었지만 날짜와 시간을 UNIX 에포크 타임스탬프 형식으로 가져올 수 있습니다.
[int64](Get-Date -UFormat %s)
이 제품은 PowerShell과 PowerShell Core 모두에서 지원됩니다.
이 원라이너는 제게 적합합니다(http://www.unixtimestamp.com/) 로 보내주세요).
[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalSeconds
밀리초 동안
[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalMilliseconds
1970년 이래로 시간대에 관계없이 몇 초를 얻으려면 다음과 같이 해야 합니다.
$unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
[int]([DateTime]::UtcNow - $unixEpochStart).TotalSeconds
저는 이 문제를 해결할 또 다른 방법을 제시하고 싶었을 뿐입니다.다음은 UTC에서 현재 Unix(에포크) 시간을 얻기 위해 사용한 하나의 라이너입니다.
$unixTime = [long] (Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s)
이것을 내부에서 밖으로 분해하는 것.
(Get-Date).범용 시간()으로
UTC 시간대의 현재 날짜/시간을 가져옵니다.현지 시간을 원하면 Get-Date로 전화하면 됩니다.그러면 이를...에 대한 입력으로 사용합니다.
[long] (Get-Date -Date (UTC 날짜/위에서 시간) -Uformat %s)
UTC 날짜/시간(첫 번째 단계부터)을 Unix 형식으로 변환합니다.-Uformat %s은 Get-Date에 결과를 Unix 에포크 시간(1970년 1월 1일 00:00:00 이후 경과된 초)으로 반환하도록 알려줍니다.이 경우 이중 데이터 유형(기본적으로 10진수)이 반환됩니다.긴 데이터 형식으로 캐스트하면 64비트 정수(소수점 없음)로 자동 변환(반올림)됩니다.십진법의 추가 정밀도를 원한다면 긴 활자로 주조하지 마십시오.
추가신용
10진수를 정수로 변환/반올림하는 또 다른 방법은 시스템을 사용하는 것입니다.수학:
[System.Math]::Round(1485447337.45246)
파워셸
$epoch = (Get-Date -Date ((Get-Date).DateTime) -UFormat %s)
그라파나로 데이터를 보내려면 UTC에서 32비트 정수로 유닉스 에포크 시간이 필요했습니다.결국 가장 좋은 해결책은 다음과 같습니다.
$unixtime = (get-date -Date (get-date).ToUniversalTime() -UFormat %s).Substring(0,10)
따라서 문자열이 생성되지만 정수로 쉽게 변환할 수 있습니다.
[int]$unixtime = (get-date -Date (get-date).ToUniversalTime() -UFormat %s).Substring(0,10)
우분투 기계를 시험해 봤습니다.위의 명령어와 Linux 명령어의 결과입니다.
date +%s
동일합니다.
저는 2038년 문제를 피하기 위해 초(Int32)가 아닌 틱(Int64)을 기준으로 다음을 제안합니다.[수학]:: 플로어(Floor)는 유닉스 시간이 에포크 이후의 전체 초수를 기준으로 하기 때문에 사용됩니다.
[long][Math]::Floor((($DateTime.ToUniversalTime() - (New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc))).Ticks / [timespan]::TicksPerSecond))
여기에 제가 한동안 사용해왔던 TO와 FROM CTIME을 모두 변환하는 스크립트가 있습니다.(이 스크립트는 "새로운 스크립트" 유형의 군중을 위해 작성되었기 때문에 더 길게는 다양한 코멘트를 포함합니다.
# Here's a very quick variant to 'get the job done'
[Int64]$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 ([Int64]$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'
[int64]$Ctime = 0
$Ctime = (New-TimeSpan -Start $Epoch -End $InputEpoch).TotalSeconds
return $Ctime
}
도움이 되기를 바랍니다. 특히 초보자에게 조금 더 친근한 것을 원한다면 :).
아래 cmdlet은 윈도우 가동 시간을 유닉스로 변환합니다.
$s=Get-WmiObject win32_operatingsystem | select csname,@{LABEL='LastBootUpTime';EXPRESSION{$_.ConverttoDateTime($_.lastbootuptime)}};
[Math]::Floor([decimal](Get-Date($s.LastBootUpTime.ToUniversalTime()).ToUniversalTime()-uformat "%s"))
다시 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)
자바스크립트는 에포크 이후 밀리초를 사용하기 때문에 이 또한 작동해야 합니다.
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)
get-date의 Uformat 매개변수를 사용할 수 있습니다.그러나 우선 주어진 워크스테이션의 날짜가 정확한지 확인하고 싶습니다(정확한 시간이 설정된 서버가 있는 회사 네트워크에 연결된 워크스테이션을 고려합니다).
#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"
그러면 실제 유닉스 타임스탬프를 가져와 실제 날짜와 생성 날짜 사이의 개체(계정)를 비교합니다(유닉스 타임스탬프가 제한 날짜를 초과하는 경우 계정 삭제 작업).
#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
}
시그널15의 대답은 저에게는 좀 장황합니다.이런 식으로 했습니다.
[int] (Get-Date (Get-Date).ToUniversalTime() -uformat '%s')
답이 늦었습니다...
둘다 Hare 입니다 는 입니다 입니다.ConvertTo-UnixTime
&ConvertFrom-UnixTime
두 모두 가능상 두인두능)능(두두
function ConvertFrom-UnixTime () {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline, Position = 0)]
[Int64]$UnixTime
)
begin {
$epoch = [DateTime]::SpecifyKind('1970-01-01', 'Utc')
}
process {
$epoch.AddSeconds($UnixTime)
}
}
function ConvertTo-UnixTime {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline, Position = 0)]
[DateTime]$DateTime
)
begin {
$epoch = [DateTime]::SpecifyKind('1970-01-01', 'Utc')
}
process {
[Int64]($DateTime.ToUniversalTime() - $epoch).TotalSeconds
}
}
문화에 구애받지 않고 실제로는 매우 빠른 답변:
[int64]([double]::Parse((get-date -uformat "%s"),[cultureinfo][system.threading.thread]::currentthread.currentculture))
이것은 약간의 자극을 줍니다.NET "magic"은 실제로 포맷된 문자열을 생성할 때 현재 스레드의 문화 설정을 사용하여 이중으로 변환된 다음 기본적으로 제공된 이중을 정확히 플로어화하는 int64로 변환합니다.타임스탬프를 를우다을는합니다를 사용합니다.-date ([DateTime]::UtcNow)
인에get-date
변환할 시간으로 현재 UTC 시간을 사용합니다.
[int64]([double]::Parse((get-date -date ([DateTime]::UtcNow) -uformat "%s"),[cultureinfo][system.threading.thread]::currentthread.currentculture))
추신: 출력에 문자열이 꼭 필요한 경우가 아니라면 정수를 사용하는 것이 전체적으로 프로그래밍 문화에 더 좋습니다.
다양한 시간대에서 테스트가 잘 된 작업:
(Get-Date).ToUniversalTime().Subtract((Get-Date "01/01/1970")).Totalseconds
# or
[DateTimeOffset]::Now.ToUnixTimeSeconds()
아래는 GMT+0 시간대에서만 작동하므로 권장하지 않습니다.
Get-Date -UFormat %s
그건 그렇고, 파이썬을 설치했다면 EEPCO UNIX 시간도 확인할 수 있습니다.
python -c "import time;print(time.time())"
유닉스 시대 이래로 밀리초를 얻는 것에 관심이 있는 사람이 있다면, 제 접근법은 이런 것입니다.
[int](Get-Date -UFormat %s) * 1000 + (Get-Date).Millisecond
언급URL : https://stackoverflow.com/questions/4192971/in-powershell-how-do-i-convert-datetime-to-unix-time
'programing' 카테고리의 다른 글
NodeJS - MySQL(Callback) Connections를 MariaDB(Promise/async-wait)로 업데이트해야 합니까? (0) | 2023.09.08 |
---|---|
비활성화된 입력 요소를 고려하여 $.serialize()를 만드는 방법은 무엇입니까? (0) | 2023.09.08 |
어떻게 하면 최소한의 오버헤드로 간단한 서버리스 p2p 브라우저를 브라우저 메시징에 구현할 수 있습니까? (0) | 2023.09.08 |
MySQL 클라이언트에 대한 자동 커밋을 해제하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
조회 방법의 Spring Data 선택적 매개 변수 (0) | 2023.09.03 |