在PowerShell中,如何将DateTime转换为UNIX时间?

时间:2010-11-16 10:05:27

标签: datetime powershell

在PowerShell中,如何将DateTime的字符串转换为秒的总和?

18 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:17)

如上所述,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一致的行为)

答案 2 :(得分:15)

使用.NET Framework 4.6,您可以使用DateTimeOffset类的ToUnixTimeSeconds方法:

[DateTimeOffset]::Now.ToUnixTimeSeconds()

$DateTime = Get-Date #or any other command to get DateTime object
([DateTimeOffset]$DateTime).ToUnixTimeSeconds()

答案 3 :(得分:13)

这个单线程适用于我(与http://www.unixtimestamp.com/比较)

[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalSeconds

毫秒

[int64](([datetime]::UtcNow)-(get-date "1/1/1970")).TotalMilliseconds

答案 4 :(得分:6)

为了获得自1970年以来的秒数而不依赖于时区,我会选择:

$unixEpochStart = new-object DateTime 1970,1,1,0,0,0,([DateTimeKind]::Utc)
[int]([DateTime]::UtcNow - $unixEpochStart).TotalSeconds

答案 5 :(得分:6)

我只想提出另一种,希望更简单的方法来解决这个问题。这是我用来获取UTC当前Unix(纪元)时间的一个班轮:

$unixTime = [long] (Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s)

从内到外打破这个:

(GET-日期).ToUniversalTime()

以UTC时区获取当前日期/时间。如果您想要当地时间,只需致电获取日期。 然后将其用作...

的输入

[long](获取日期 - 日期(上面的UTC日期/时间)-UFormat%s)

将UTC日期/时间(从第一步)转换为Unix格式。 -UFormat%s 告诉 Get-Date 将结果作为Unix纪元时间(自1970年1月1日00:00:00开始经过的秒数)返回。请注意,这会返回 double 数据类型(基本上是十进制)。通过将其转换为 long 数据类型,它会自动转换(舍入)为64位整数(无小数)。如果您想要十进制的额外精度,请不要将其转换为 long 类型。

额外信用

将十进制数转换/舍入为整数的另一种方法是使用 System.Math

[System.Math]::Round(1485447337.45246)

答案 6 :(得分:4)

Powershell的

$epoch = (Get-Date -Date ((Get-Date).DateTime) -UFormat %s)

答案 7 :(得分:2)

这里有一个脚本,可以转换我曾经使用过一段时间的TO和FROM CTIME(更长一段时间,因为它是为#34;脚本编写和#34;类型人群编写的,各种评论。

# Here's 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
}

希望有所帮助,特别是如果你只是想要一些对初学者来说更友好的东西:)。

答案 8 :(得分:2)

I suggest the following, which is based on ticks (Int64), rather than seconds (Int32), to avoid the Year 2038 problem. [Math]::Floor is used, as Unix time is based on the number of whole seconds since the epoch.

[long][Math]::Floor((($DateTime.ToUniversalTime() - (New-Object DateTime 1970, 1, 1, 0, 0, 0, ([DateTimeKind]::Utc))).Ticks / [timespan]::TicksPerSecond))

答案 9 :(得分:1)

不确定何时将-uformat添加到get-date,但是它允许您使用UNIX日期格式字符串;

[int64](get-date -uformat %s)

答案 10 :(得分:1)

您可以使用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"  

然后我得到实际的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
}

答案 11 :(得分:1)

要向Grafana发送数据,我需要Unix Epoch时间(来自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)

我在Ubuntu计算机上对此进行了测试。以上命令和Linux命令的结果

date +%s

完全相同。

答案 12 :(得分:1)

Signal15's answer 对我来说有点冗长。我是这样做的:

[int] (Get-Date (Get-Date).ToUniversalTime() -uformat '%s')

答案 13 :(得分:0)

再次与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)

答案 14 :(得分:0)

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"))

答案 15 :(得分:0)

这个也应该有用,因为javascript使用了自epoch后的毫秒:

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)

答案 16 :(得分:0)

最新答案...

为方便起见,Hare都是转换函数ConvertTo-UnixTimeConvertFrom-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
    }
}

答案 17 :(得分:0)

一个独立于文化的,实际上相当快的答案:

[int64]([double]::Parse((get-date -uformat "%s"),[cultureinfo][system.threading.thread]::currentthread.currentculture))

当涉及到实际生成格式化字符串时,这会调用一些 .NET“魔法”,使用当前线程的区域性设置将其转换为双精度,然后转换为 int64,默认情况下,它确实对所提供的双精度进行了铺底。如果您需要 UTC 时间戳,请在 -date ([DateTime]::UtcNow) 中使用 get-date 以使用当前 UTC 时间作为转换时间。

[int64]([double]::Parse((get-date -date ([DateTime]::UtcNow) -uformat "%s"),[cultureinfo][system.threading.thread]::currentthread.currentculture))

PS:除非你真的需要一个字符串作为你的输出,否则使用整数对的编程文化来说总体上更好。