Powershell-将日期与CSV日期进行比较

时间:2020-02-06 11:21:49

标签: powershell datetime datetime-format

我正在尝试将输入的日期与CSV中的日期进行比较,如果输入的日期早于CSV中的日期,则会显示一条消息。

遇到困难时,不确定是否需要将CSV中的日期从字符串转换为正确比较的结果。

通过代码已经达到了这一点:

$CSV=Import-Csv C:\Users\person\Desktop\date.csv 
$InputDate = Get-Date -Format "MM/dd/yyyy" (Read-Host -Prompt 'Enter the date')
$CreatedDate = Get-Date -Format "MM/dd/yyyy HH:mm" $CSV.updated

if($InputDate -gt $CreatedDate) {
  write-host "Input Newer"
}
else {
  write-host "Input Older"
}

比较似乎无法正常进行。

CSV格式如下(包含一行,因此可以假设$CSV.updated包含单个日期字符串)

updated
11/07/2016 16:14

2 个答案:

答案 0 :(得分:2)

您需要将字符串中的日期解析为datetime类型以进行日期比较。

$CSV = Import-Csv C:\Users\person\Desktop\date.csv 
$InputDate = [datetime]::Parse( $(Read-Host -Prompt 'Enter the date (MM/dd/yyyy)') )
$CreatedDate = [datetime]::Parse( $CSV.updated )
if($InputDate -gt $CreatedDate)
{write-host "Input Newer"}
else
{write-host "Input Older"}

答案 1 :(得分:0)

Kiran Patnayakuni's answer提供了有效的解决方案;让我更清楚地说明问题出在哪里:

  • 您似乎希望-Format "MM/dd/yyyy"指定一种输入解析格式;实际上,它格式化输出,然后将其变成[string]

    • 但是,为了进行有意义的日期比较,您需要一个[datetime]实例。
  • 根据隐含的标准格式,隐式地解析了(隐含的)-Date参数((Read-Host ...)$csv.updated)的参数当前文化System.Globalization.CultureInfo.CurrentCulture)。

因此:

  • 如果您的论点已经被隐式解析正确识别(如您对Kiran答案的接受所示),解决方案是简单地删除-Format自变量从您的代码中:

      # Parse each input string implicitly, based on the current culture,
      # and output a [datetime] instance, which will compare as expected
      # with `-gt`
      $InputDate = Get-Date (Read-Host -Prompt 'Enter the date')
      $CreatedDate = Get-Date $CSV.updated
    
  • 相比之下,如果确实需要通过"MM/dd/yyyy"格式字符串进行解析才能识别您的参数,请调用.NET方法[datetime]::ParseExact(<string>, <format>[, <culture>])System.DateTime.ParseExact );例如:

      # Note: The input string must match the format *exactly*
      $InputDate = [datetime]::ParseExact(
        (Read-Host -Prompt 'Enter the date'), # input string
        "MM/dd/yyyy", # format string
        $null  # default to the current culture's rules
      ) 
    

请继续阅读以获取背景信息。


Get-Date输入和输出格式为数据类型:

-Format "MM/dd/yyyy"未指定 input 解析格式,而是指定了 output 字符串格式格式,其中有两种含义:

    传递给输入参数-Date
  • String 输入(第一个 positional 参数绑定到)是隐式< / em>根据当前区域性 可以识别的 标准字符串格式将其解析为[datetime] [1] ;实际上,以下内容称为“幕后”:

      [datetime]::Parse((Read-Host -Prompt 'Enter the date'), [cultureinfo]::CurrentCulture)
    
    • (在上面的调用中省略[cultureinfo]::CurrentCulture具有相同的效果。)
    • 注意事项当您将字符串投射[datetime] 时,它是 不变式文化([cultureinfo]::InvariantCulture,基于美国英语),PowerShell经常这样做是为了确保跨文化的代码的稳定性; Get-Date之类的cmdlet不是不是文化不变的,这是历史性的事故,由于担心会破坏旧代码而无法得到纠正;有关背景,请参见this GitHub issue。例如,在实行fr-FR(法语)文化的情况下,[datetime] '12/1]的产生时间为12月1日(月初),而Get-Date -Date '12/1'的产生时间为 1月12日(第一天)。
  • Get-Date命令将返回(格式化的)字符串,而不是[datetime]实例;也就是说,基于 current 文化的规则,根据输入传递给[datetime]的格式字符串,对在输入中隐式解析的-Format实例进行格式化;如果$dt包含一个[datetime]实例,则 -Format "MM/dd/yyyy"等价于(请注意,直接调用System.DateTime.ToString()可以使您选择指定一个不同的文化,-Format则没有)

      $dt.ToString("MM/dd/yyyy", [cultureinfo]::CurrentCulture)
    

(自PowerShell v7.0起),Get-Date cmdlet对指定 input 解析的格式字符串具有 no 支持。

  • 如所述,将字符串传递给-Date会导致它被基于字符串识别的标准日期/时间格式进行隐式解析。 当前文化

  • 您必须直接调用.NET方法[datetime]::ParseExact(<string>, <format>[, <culture>])System.DateTime.ParseExact,如顶部所示。

  • 一旦您拥有一个[datetime]实例,就可以将其(通过-Date传递给Get-Date -Format以获得针对当前区域性的格式化字符串表示形式;或者,您可以直接在实例上调用.ToString(<format>[, <culture>])System.DateTime.ToString),这也使您可以选择格式化不同文化

对于Get-Date输入和输出数据类型

从根本上讲,输入的传递方式(特定参数)基于cmdlet选择实例的方式来确定如何解释生成的[datetime]实例 .Kind属性值(UtcLocalUnspecified)。

.Kind属性值确定[datetime]实例表示的特定全局时间点(如果有)。 .Kind值还可能影响实例的字符串表示形式,具体取决于所应用的是哪种特定格式(尤其是时区信息的包含)。

生成的[datetime]实例为:

  • 其中之一:直接输出 (默认情况下)
  • 或:如果传递了-Format参数,则是得出请求的字符串表示形式[string])的基础。

Get-Date确定.Kind属性值,如下所示:

  • 使用 no -Date参数,您将获得一个Local实例(代表当前时间点)

    • (除非还将字符串 传递给-Date),使用各种偏移量参数(例如-Year-Day)会产生{{1 }}实例。
  • 使用{<1>}类型的Local的{​​{1}}参数,该实例按原样使用,这意味着现有的-Date属性值被保留。

  • 使用 string [datetime]参数(将被隐式解析),.Kind的值将为-Date(代表抽象时间点(不参考特定时区),包括与.Kind之类的参数结合使用的时间。

  • 一个数字 Unspecified参数(例如-Year)被解释为一个System.DateTime.Ticks值,该值也产生一个-Date实例。

注意:PowerShell [Core] 7.1将引入一个637165787436900010开关,该开关可使输出/待格式化字符串的实例为Unspecified类型; -AsUTCUtc开关(和/或-AsLocal参数)也正在讨论中-参见this GitHub issue


[1]如果输入已经是-AsUnspecified实例,则按原样使用它。