在PowerShell中对数据类型为String且格式为'MM/yyyy'和'dd/MM/yyyy'的日期进行排序

mgdq6dx1  于 2023-06-29  发布在  Shell
关注(0)|答案(3)|浏览(106)

我有一个带有日期的哈希表(hahstable键,存储为字符串)和在这些日期创建的用户数量。我想根据日期对Hashtable进行排序(按日期和按月份)
当我按键对hashatable排序时,它给出了结果:

19/03/2023
31/03/2023                     
31/05/2023                     
31/08/2022                     
31/10/2022                     
31/12/2022

因此,基本上排序发生在字符串数据结构中,而不是日期。
按日期排序的正确方法是:

31/10/2022                     
31/12/2022
19/03/2023
31/03/2023                     
31/05/2023                     
31/08/2022

考虑到日期是以字符串的形式存储的,并且在结尾也必须以字符串的形式存储,如何正确地对它进行排序。
我需要同样的排序,但日期格式为MM/yyyy
错误:

10/01/2023
10/05/2023
15/12/2022
14/11/2022
23/02/2023

右:

14/11/2022
15/12/2022
23/02/2023
10/01/2023
10/05/2023

谢谢你!
我试着这样分类:

$hashtable.GetEnumerator() | Sort-Object -Property:Key

但它将date排序为字符串,而不是日期。
我尝试将字符串转换为日期并返回,但它不适用于需要按月或年排序的情况。

vatpfxk5

vatpfxk51#

$HashTable =  @{
    '10/01/2023' = 1
    '10/05/2023' = 2
    '15/12/2022' = 3
    '14/11/2022' = 4
    '23/02/2023' = 5
}

$HashTable.GetEnumerator() | Sort-Object { [DateTime]::Parse($_.Key, (Get-Culture nn-NO)) }
# Or: ... | Sort-Object { [DateTime]::ParseExact($_.Key, 'dd/MM/yyyy', $Null) }

Name                           Value
----                           -----
14/11/2022                     4
15/12/2022                     3
10/01/2023                     1
23/02/2023                     5
10/05/2023                     2
v1l68za4

v1l68za42#

那这个呢

$hashtable = @{}
$hashtable.add( '19/03/2023', 1 )
$hashtable.add( '31/03/2023', 2 )
$hashtable.add( '31/05/2023', 3 )
$hashtable.add( '31/08/2022', 4 )
$hashtable.add( '31/10/2022', 5 )
$hashtable.add( '31/12/2022', 6 )

$hashtable.GetEnumerator() | Sort-Object {$_.name -as [datetime]}
6pp0gazn

6pp0gazn3#

使用计算的特性,可以按每个特性的不同顺序对数据进行排序:

$hashtable = @{}
@'
19/03/2023
31/03/2023
12/05/2023
31/08/2022
31/10/2022
31/12/2022
'@ -split [System.Environment]::NewLine |
    ForEach-Object {
        $hashtable.Add(
            $_, (Get-Random -Minimum 0 -Maximum 10))
    }

$hashtable.GetEnumerator() |
  Sort-Object -Property @{expr={
    [datetime]::ParseExact($_.Key, @('dd/MM/yyyy'), $null)}}
Name                           Value                                           
----                           -----                                           
31/08/2022                     0                                               
31/10/2022                     2                                               
31/12/2022                     8                                               
19/03/2023                     3                                               
31/03/2023                     3                                               
12/05/2023                     1

注意ParseExact method可以再重载一次。

相关问题