usort 字符串到转换日期
usort On String to Date Converted
我正在尝试采用 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]);
}
我希望它是按那个顺序,但它只是按相同的顺序返回。我不明白我做错了什么。
在这部分
date('dmY H:i', strtotime($a));
您正在尝试使用格式创建 date
,但您使用 strtotime()
设置了 returns 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;
}
仔细看字符串
$a = date('dmY H:i', strtotime($a));
strtotime($a)
正在尝试将字符串转换为时间戳。因为您有自定义日期格式,字符串 09082020 00:00
将被转换为 false
.
之后,date('dmY H:i', false)
将return01011970 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;
});
我正在尝试采用 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]);
}
我希望它是按那个顺序,但它只是按相同的顺序返回。我不明白我做错了什么。
在这部分
date('dmY H:i', strtotime($a));
您正在尝试使用格式创建 date
,但您使用 strtotime()
设置了 returns 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;
}
仔细看字符串
$a = date('dmY H:i', strtotime($a));
strtotime($a)
正在尝试将字符串转换为时间戳。因为您有自定义日期格式,字符串 09082020 00:00
将被转换为 false
.
之后,date('dmY H:i', false)
将return01011970 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;
});