我有6个日期,分别是:2018-07-21
、2018-08-13
、2018-08-30
、2018-9-02
、2018-09-28
、2018-11-02
我需要提取出时间间隔最小的两个日期,也就是上面这几个日期我需要提取出:2018-08-30
、2018-9-02
请问怎么做?
我有6个日期,分别是:2018-07-21
、2018-08-13
、2018-08-30
、2018-9-02
、2018-09-28
、2018-11-02
我需要提取出时间间隔最小的两个日期,也就是上面这几个日期我需要提取出:2018-08-30
、2018-9-02
请问怎么做?
php的话可以使用array_reduce
遍历一遍即可
$dates = ['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'];
$minSeconds = null;
$result = [];
array_reduce($dates, function($date1, $date2) use(&$minSeconds, &$result) {
if (empty($date1)) {
return $date2;
}
$date1Seconds = strtotime($date1);
$date2Seconds = strtotime($date2);
$seconds = $date2Seconds - $date1Seconds;
if ($minSeconds === null || $seconds < $minSeconds) {
$minSeconds = $seconds;
$result = [$date1, $date2];
}
return $date2;
}, null);
print_r($result);
const arr=['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'];
function toDate(str){
const arr=str.split(/\D+/);
arr[1]-=1;
arr.unshift(Date);
const d=+new (Date.bind.apply(Date,arr))();
return d;
}
const timeArr=arr.map(toDate);
let min,index;
for(let i=0;i<timeArr.length-2;i++){
const dur=timeArr[i+1]-timeArr[i];
if(min === undefined){
min=dur;
index=i;
}else if(min>dur){
min=dur;
index=i;
}
}
console.log(arr[index],arr[index+1]);
假设你的日期是已经按先后顺序排序了的 如果没有先sort下
我来一个PHP的吧
$arr=['2018-07-21','2018-08-13','2018-08-30','2018-9-02','2018-09-28','2018-11-02'];
$data = [];
for ($i = count($arr)-1 ; $i >= 0; $i--) {
for ($j = 0; $j < $i ; $j++) {
$a = $arr[$i];
$b = $arr[$j];
$v = date_diff(date_create($a), date_create($b)); // 取两个日期相差的天数
// 格式化成天 http://php.net/manual/zh/function.date-diff.php
// 两个日期做键 相差天数做值
// $data[$a.'-'.$b] = $v->format('%a');
$data[$v->format('%a')] = $a.'-'.$b;
}
}
echo "<pre>";
//$res = array_flip($data); //反转键值
ksort($data); //按键排序
var_dump(array_shift($data)); //取出第一个 结果string(20) "2018-9-02-2018-08-30"
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
趁着排序顺便算一下更省事