繁体   English   中英

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

[英]Powershell - compare date with CSV date

我试图将输入的日期与 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

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

$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"}

Kiran Patnayakuni 的回答提供了一个有效的解决方案; 让我更清楚地说明问题是什么:

  • 您似乎期望-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"不指定输入解析格式,它指定输出字符串格式格式,这有两个含义:

  • 传递给输入参数-Date (第一个位置参数绑定到的)的字符串输入被隐式解析[datetime] ,基于当前区域性[1]识别标准字符串格式 实际上,以下是在幕后调用的:

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

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

(从 PowerShell v7.0 开始), Get-Date cmdlet支持为输入解析指定格式字符串。

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

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

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

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

从根本上说,输入的传递方式(特定参数)决定了结果[datetime]实例的解释方式,具体取决于 cmdlet 如何选择实例的.Kind属性值( UtcLocalUnspecified )。

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

结果[datetime]实例是:

  • 要么:直接输出(默认)
  • 或者:如果传递了-Format参数,则是派生请求的字符串表示形式( [string] ) 的基础。

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

  • 没有-Date参数,你会得到一个Local实例(代表当前时间点)

    • (除非字符串被传递到-Date ),使用各种偏移参数,如-Year-Day ,产生一个Local实例为好。
  • 对于已经[datetime]类型的-Date参数,该实例按原样使用,这意味着保留现有的.Kind属性值。

  • 使用字符串-Date参数(隐式解析), .Kind值将是Unspecified (表示抽象时间点,不参考特定时区),包括与-Year等参数组合时。

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

注意:PowerShell [Core] 7.1 将引入一个-AsUTC开关,使输出/要被字符串格式化的实例类型为Utc -AsLocal-AsUnspecified开关(和/或-AsKind <kind>参数)也在讨论中 - 请参阅此 GitHub 问题


[1] 如果输入已经是[datetime]实例, [datetime]原样使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM