使用PowerShell的日期之间的差异

时间:2014-01-10 19:29:19

标签: powershell

我正在学习Windows PowerShell,并且我试图在两个日期之间得到月份差异:

For example: end: 2014-06-01
now: 2014-01-10
answer: 6 months

$now = get-date
    $date = $end -as [DateTime];
    if (!$date)
    {
      'You entered an invalid date'
    }
    else
    {
      $nts = ($now - $end).Months
      write-output $nts
    }

我已尝试过所有内容,但我无法在PowerShell中获得正确的月份。我该如何解决?

4 个答案:

答案 0 :(得分:19)

$endFromDatabase变量来自何处?这一部分在你的帖子中并不清楚。

要演示减去DateTime个对象,请参阅下面的示例。

$TimeSpan = [DateTime]'2014-01-10' - [DateTime]'2014-01-06';

您将从操作中收到System.TimeSpan,因此您可以浏览以下成员:

$TimeSpan.TotalDays;

我的猜测是你只需要修改$endFromDatabase变量中的值,这样它就可以转换为System.DateTime对象。

背景

从另一个[DateTime]对象中减去[DateTime]对象是有效的,因为[DateTime]类会重载减法运算符,从而导致op_subtraction中间语言(IL)方法。您可以在.NET对象资源管理器工具中检查这一点,例如.NET Reflector。

您会注意到减法运算符的第二个重载,它允许您从[TimeSpan]对象中减去[DateTime]个对象。

.NET Reflector Screenshot

答案 1 :(得分:9)

这样的东西?

$begin = [datetime]'02/10/2011'
$end   = [datetime]'01/10/2013'

$monthdiff = $end.month - $begin.month + (($end.Year - $begin.year) * 12)
$monthdiff

23

答案 2 :(得分:0)

这和我原来的代码一样接近。在一个时间跨度中减去datetime的结果,该时间跨度具有days成员,但不是月成员。 ($date - $now).gettype()

$end = '2014-06-01'
$now = get-date
$date = $end -as [DateTime];
if (!$date) 
{
  'You entered an invalid date'
}
else 
{
  $nts = ($date - $now).days/30
  write-output $nts
}

答案 3 :(得分:0)

您也可以为此使用 New-Timespan

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/new-timespan?view=powershell-7.1

<块引用>

New-TimeSpan cmdlet 创建一个 TimeSpan 对象,该对象代表一个 时间间隔。您可以使用 TimeSpan 对象来增加或减少时间 来自 DateTime 对象。

文件的 lastwritetime 与现在的时差:

enter image description here

New-TimeSpan -Start (get-childitem  test.txt).LastWriteTime -end (get-date)

enter image description here