【问题标题】:Powershell Date mathPowershell 日期数学
【发布时间】:2023-01-25 01:15:39
【问题描述】:

我正在尝试确定 1 个设定日期何时大于或等于随机日期。

$2WeeksFuture = $null
# Calculate desired date 2 weeks from today
$2WeeksFuture = (Get-Date).AddDays(14)
# Convert to DateTime and apply formatting
$2WeeksFuture = (Get-Date -Date $2WeeksFuture -Format ("MM-dd-yy"))

$TimeMath | ForEach-Object {
    foreach ($User in $GSuspend ) {
        If ((Get-Date -Date $2WeeksFuture -Format ("MM-dd-yy")) -ge (get-date -date ($User.creationTime) -Format ("MM-dd-yy"))) {
            Write-Host "$(Get-Date -Date $2WeeksFuture -Format ("MM-dd-yy")) -ge $(get-date -date ($User.creationTime) -Format ("MM-dd-yy"))"
        }
    }
}

错误的结果

02-07-23 -ge 01-08-20
02-07-23 -ge 01-30-19
02-07-23 -ge 01-30-19
02-07-23 -ge 01-30-19
02-07-23 -ge 01-30-19
02-07-23 -ge 01-30-19
02-07-23 -ge 01-30-19

我尝试了很多组合,但都不起作用。

【问题讨论】:

  • 比较日期只能正确地完成,如果你获取涉及的字符串,或者当你这样做时,首先将它们解析为 [DateTime]s (不是另一种方式)。 $TimeMath 里有什么? $GSuspend 里有什么? $user.creationTime 的类型是什么?
  • 我将重新格式化我的问题。很好的观察。但即使是 $2WeeksFuture 也会以字符串的形式出现。 @JeroenMostert
  • 在您想要显示它或从文件或字符串中读取它之前,不要担心日期格式。 Get-Date 返回一个 DateTime 对象,该对象可以直接与另一个 DateTime 对象进行比较,而无需考虑文化/格式。此外,DateTime 对象具有可用于确定两个 DateTime 之间的时间量或计算与另一个 DateTime 相隔指定间隔的 DateTime 的方法。
  • -Format参数使Get-Date输出字符串而不是 [DateTime] 对象。从两个调用中删除-Format ("MM-dd-yy"),它就会工作
  • 不,$2WeeksFuture[DateTime](至少最初)。当显示它时,它被格式化为一个字符串,但你可以验证它不是 (Get-Date).AddDays(14).GetType()。这是您要与之比较的其他内容,应该进行转换(通过[DateTime]::ParseExact(),例如:[DateTime]::ParseExact('02-27-23', 'MM-dd-yy', [CultureInfo]::InvariantCulture))。

标签: powershell


【解决方案1】:

正如@MathiasR.Jessen 和@JeroenMostert 所提到的,您已经拥有了DateTime 对象。例如

$2WeeksFuture = $null
# Calculate desired date 2 weeks from today
$2WeeksFuture = (Get-Date).AddDays(14)

PS C:> $2WeeksFuture.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType

使用开关 -Format ("MM-dd-yy") 将其转换为 String 对象:

PS C:> (Get-Date -Date $2WeeksFuture -Format ("MM-dd-yy")).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

执行日期的字符串比较将不起作用,与放入字符串的方式相同:

if("Tomorrow" -gt "Yesterday"){..}

不管用。相反,您应该使用 DateTime 对象本身(具有正确的基础条件逻辑)来执行比较。

您已经完成了一半的艰苦工作,将信息/字符串转换为 DateTime 对象。现在您只需要删除if 语句中的格式化部分,以确保您不会转换回字符串。例如

$2WeeksFuture = $null
# Calculate desired date 2 weeks from today as a DateTime object
$2WeeksFuture = (Get-Date).AddDays(14)

$TimeMath | ForEach-Object {
    foreach ($User in $GSuspend ) {
        If ($2WeeksFuture -ge (Get-Date -Date ($User.creationTime))) {
            Write-Host "$(Get-Date -Date $2WeeksFuture -Format ("MM-dd-yy")) -ge $(get-date -date ($User.creationTime) -Format ("MM-dd-yy"))"
        }
    }
}

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多