繁体   English   中英

ParseExact 将字符串转换为日期格式

[英]ParseExact to convert string to date format

我有一个 csv 文件,其日期列格式如下。 我如何使用 ParseExact 命令转换为日期格式以与当前日期进行比较。

Thu Oct 28 09:40:54 WEST 2021
Sun Mar 20 07:23:44 WET 2022
Sat Oct 30 15:23:02 EDT 2021
Thu Aug 26 11:07:22 SGT 2021
Tue Sep 28 10:00:54 HKT 2021
Fri Jan 07 11:08:45 SAST 2022
$date = "Thu Oct 28 09:40:54 WEST 2021"
[datetime]::ParseExact($date, 'ddd MMM dd HH:mm:ss \W\E\S\T yyyy', [cultureinfo]'en-US')

这有效..但是我如何遍历所有日期字符串并与当前日期进行比较。

正如Jeroen Mostert评论的那样,您需要解析时区缩写并从中获取 UTC 偏移量,以便将字符串转换为可以比较的日期。
下面通过使用开关来实现,但是如果文件中有很多不同的时区,则最好使用查找哈希表。

Import-Csv -Path 'X:\dates.csv' | ForEach-Object {
    # assuming the property is listed under a column header 'Date'
    if ($_.Date -match '(WES?T|EDT|SGT|HKT|SAST) \d{4}$') {
        # either use this switch or create a Hashtable with all UTC offsets
        # for each TimeZone abbreviation you might have in the CSV

        # for demo, I'm using a switch
        $UTCoffset = switch ($matches[1]) {
            'WET'  { 0; break}  # Western Europe Standard Time
            'WEST' { 1; break}  # Western European Summer Time
            'EDT'  {-4; break}  # Eastern Daylight Time
            'EST'  {-5; break}  # Eastern Standard Time
            'SGT'  { 8; break}  # Singapore Time (Standard time)
            'HKT'  { 8; break}  # Hong Kong Time (Standard time)
            'SAST' { 2; break}  # South Africa Standard Time
        }
        # remove the timezone abbreviation from the date string
        $dateToParse = $_.Date -replace "$($matches[1]) "
        # parse the date as UTC ([cultureinfo]'en-US' can be replaced by [cultureinfo]::InvariantCulture)
        $dateUTC = ([datetime]::ParseExact($dateToParse, 'ddd MMM dd HH:mm:ss yyyy', [cultureinfo]'en-US')).AddHours(-$UTCoffset)
        # unfortunately, the above specifies the .Kind property as 'Local', so we must first set this to 'Utc'
        # and then do .ToLocalTime() on it in order to compare with our local reference date
        $dateLocal = ([datetime]::SpecifyKind($dateUTC, 'Utc')).ToLocalTime()

        # do your comparison here against the reference date
        # for demo, just output the converted date
        Write-Host "'$($_.Date)' translates to $dateLocal"
    }
}

暂无
暂无

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

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