[英]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
属性值( Utc
、 Local
或Unspecified
)。
.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.