Powershell 无法识别已格式化为日期时间格式的日期

问题描述 投票:0回答:1

我正在通过 API 使用 powershell 搜索 Splunk 并获取包含日期的数据列表(不是日期时间格式)。

API 调用由一个运行良好的函数执行,它适用于需要搜索以及开始和结束日期/时间的初始搜索。

初始搜索完成后,我将循环结果并执行子搜索(在 Splunk 中)从不同的索引中查找其他数据。

我将返回的日期和时间(例如 16/02/2024 12:45:27)在空格上分开,只返回日期部分,然后创建两个字段:

$EmailSearchStartdt = "$(($DateConversion).split(" ")[0]) 00:00:00" 
$EmailSearchEnddt = "$(($DateConversion).split(" ")[0]) 23:59:59" 

这两个日期字段都失败了。我从初始搜索中获取日期并将它们转回日期时间,如下所示:

$EmailSearchStartdt = ([datetime]::ParseExact($EmailSearchStartdt,"dd/MM/yyyy HH:mm:ss", [System.Globalization.CultureInfo]::GetCultureInfo("en-GB")))

$EmailSearchEnddt = ([datetime]::ParseExact($EmailSearchEnddt,"dd/MM/yyyy HH:mm:ss", [System.Globalization.CultureInfo]::GetCultureInfo("en-GB")))

问题是 Powershell 正在将日期和月份反转为美国格式(我在英国,具有英国时区设置等,当反馈到函数中时,我得到以下信息:

EmailSearchStartdt:15/03/2024 00:00:00(这是字符串) EmailSearchStartdt:03/15/2024 00:00:00(这是在 parseexact 之后) EmailSearchEnddt:15/03/2024 23:59:59(这是字符串) EmailSearchEnddt:03/15/2024 23:59:59(这是在 parseexact 之后)

结果是 Splunk 什么也没发现,因为日期已颠倒。

如果我执行以下操作:

$EmailSearchStartdt = get-date -date $EmailSearchStartdt -Format "dd MMM yyyy HH:mm:ss"
$EmailSearchEnddt = get-date -date $EmailSearchEnddt -Format "dd MMM yyyy HH:mm:ss"

Splunk 似乎接受这一点,但如果我尝试:

$EmailSearchStartdt = (get-date -date $EmailSearchStartdt -Format "dd MMM yyyy HH:mm:ss").adddays(-3)

$EmailSearchEnddt = (get-date -date $EmailSearchEnddt -Format "dd MMM yyyy HH:mm:ss").adddays(1)

我得到:

Method invocation failed because [System.String] does not contain a method named 'adddays'.

所以 Powershell 将其视为字符串。

最终,脚本被调用为两个字符串日期,但该函数在使用子搜索内部调用时会拒绝此操作。

这真的让我彻底疯了,所以任何帮助将不胜感激!

powershell datetime string-formatting
1个回答
0
投票

核心问题是 PowerShell 中的 可扩展(插值)、双引号字符串 (

"..."
) 使用 不变文化来对非字符串值进行字符串化 - 无论当前影响哪种文化(如由
Get-Culture
报告),不变区域性基于(但不同于)具有
month
-第一个日期格式的 en-US 区域性。

例如,诸如

"$(Get-Date 1970-12-01)"
always 之类的可扩展字符串会产生
12/01/1970 00:00:00
,即它首先报告月份。

相比之下,

.ToString()
方法使用当前文化,因此
(Get-Date 1970-12-01).ToString()
的输出因文化而异,并在01/12/1970 00:00:00
文化中产生
en-GB
(第一天)。

因此,

最好基于[datetime]

实例first执行任何计算和修改,然后then根据感兴趣的文化(可能是当前)显式创建字符串表示 .

就您而言,这意味着:

# Parse the input timestamp based on the given culture into # [datetime] instances. $culture = [cultureinfo] 'en-GB' $format = 'dd/MM/yyyy HH:mm:ss' $EmailSearchStartdt = [datetime]::ParseExact($EmailSearchStartdt, $format, $culture) $EmailSearchEnddt = [datetime]::ParseExact($EmailSearchEnddt, $format, $culture) # Modify these timestamps to refer to the start and end of the # calendar day (.Date returns the start of the calendar day, 00:00:00) $EmailSearchStartdt = $EmailSearchStartdt.Date $EmailSearchEnddt = $EmailSearchStartdt.Date.AddDays(1).AddSeconds(-1) # Now stringify them as needed. $outFormat = 'dd MMM yyyy HH:mm:ss' $EmailSearchStartdt.ToString($outFormat, $culture) $EmailSearchEnddt.ToString($outFormat, $culture)
    
© www.soinside.com 2019 - 2024. All rights reserved.