如何解决usort在字符串上转换为日期
我正在尝试采用 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()
设置了值,该值返回了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)
将返回01011970 00:00
。这就是为什么排序不起作用的原因。
我建议使用DateTime::createFromFormat
。
usort($items,$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;
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。