我正在尝试将输入的日期与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
答案 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
属性值(Utc
,Local
或Unspecified
)。
.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
类型; -AsUTC
和Utc
开关(和/或-AsLocal
参数)也正在讨论中-参见this GitHub issue。
[1]如果输入已经是-AsUnspecified
实例,则按原样使用它。