对格式为 dmY H:i [重复] 的日期数组进行排序

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

我正在尝试采用 mdY H:i 格式的字符串并将其在数组中排序。我的排序代码是:

function orderDates($items) {
    //Sort them. Latest one first
    usort($items, function ($a, $b) {
        $a = date('dmY H:i', strtotime($a));
        $b = date('dmY H:i', strtotime($b));

        if ($a == $b) {
            return 0;
        }
        return ($a > $b) ? -1 : 1;
    });

    return $items;
}

我有一个测试用例:

public function test_orderDates() {
    $items = ["09082020 00:00", "12072020 00:00", "14062020 00:00", "17052020 00:00", "21062020 00:00", "24052020 00:00", "26072020 00:00"];

    $rv = $this->cleanupFolder->orderDates($items);

    $this->assertNotNull($rv);
    $this->assertEquals(7, sizeOf($rv));

    $this->assertEquals("09082020 00:00", $rv[0]);
    $this->assertEquals("26072020 00:00", $rv[1]);
    $this->assertEquals("12072020 00:00", $rv[2]);
    $this->assertEquals("21062020 00:00", $rv[3]);
    $this->assertEquals("14062020 00:00", $rv[4]);
    $this->assertEquals("24052020 00:00", $rv[5]);
    $this->assertEquals("17052020 00:00", $rv[6]);
}

我希望它按照这个顺序,但它只是以相同的顺序返回。我不明白我做错了什么。

php sorting date usort
2个回答
1
投票

仔细观察绳子

$a = date('dmY H:i', strtotime($a));

strtotime($a)
正在尝试将字符串转换为时间戳。由于您有自定义日期格式,因此字符串
09082020 00:00
将转换为
false

之后,

date('dmY H:i', false)
将返回
01011970 00:00
。这就是排序不起作用的原因。

我建议使用

DateTime::createFromFormat

    usort($items, function ($a, $b) {
        $a = DateTime::createFromFormat('dmY H:i', $a);
        $b = DateTime::createFromFormat('dmY H:i', $b);

        if ($a == $b) {
            return 0;
        }
        return ($a > $b) ? -1 : 1;
    });

1
投票

在这一部分

date('dmY H:i', strtotime($a));

您正在尝试使用格式创建

date
,但您使用
strtotime()
设置值,它返回 Unix 时间戳(int)。所以您可能正在寻找类似的东西:

\DateTime::createFromFormat('dmY H:i', $a);

所以它可能是这样的:

function orderDates($items) {
    //Sort them. Latest one first
    usort($items, function ($a, $b) {
        $a = \DateTime::createFromFormat('dmY H:i', $a);
        $b = \DateTime::createFromFormat('dmY H:i', $b);

        if ($a == $b) {
            return 0;
        }
        return ($a > $b) ? -1 : 1;
    });

    return $items;
}
© www.soinside.com 2019 - 2024. All rights reserved.