2

例如:今天是12 月 4 日

  1. 2012 年 12 月

  2. 2012 年 12 月

  3. 2012 年 12 月

标题(2012 年 12 月 5 日)

标题(2012 年 12 月 7 日)

  1. 2012 年 12 月

最接近的日期是 5.12 月(不是 3.December)(较新而不是较旧)

并且如果不止一个“5. December”那么添加类 only first-child

HTML:

<div class="wrap">

<div class="zone" id="one">  
<div class="box">
    <footer class="time">1. December 2012</footer>
</div>


<div class="box">
    <footer class="time">1. December 2012</footer>
</div>

<div class="box">
    <footer class="time">3. December 2012</footer>
</div>


<div class="box">
    <h2>Title <span class="time">(5. December 2012)</span></h2>
</div>


<div class="box">
    <h2>Title <span class="time">(7. December 2012)</span></h2>
</div>


<div class="box">
    <footer class="time">9. December 2012</footer>
</div>

</div>

<div class="zone"  id="two">
    <!-- Same .zone#one but i will focus for .zone#one only-->
</div>

</div>


<code></code>

jQuery :

var closest = [];

$('.wrap > .zone:eq(0) .box').each(function(i) {
        var date = $(this).find(".time").html().replace("(","").split(".");
        closest.push(date[0]);
});



$("code").html(closest+"");

游乐场:http: //jsfiddle.net/WJvZb/

我现在来到这一步,但不知道找到最接近的日期并添加类(例如.closest类)

4

4 回答 4

1

最简单的方法是解析每个日期时间(取决于格式),将它们推入一个数组,然后遍历数组计算它们之间的时间差,并拉出最小值。您可以使用一些有用的库,例如 moment.js 来进行日期解析和计算。

var now = new Date();
var closest = -1; //array ndx
var times = [];
var els = [];

$('.time').each(function(i) {
    times.push(someParsingMethod($(this).text());
    els.push($(this));
});

//initial difference
var diff = times[0].getTime() - now.getTime();

//check for lowest difference greater with a target date greater than now
for(var i=0;i<times.length;i++){
   var tmpDiff = times[i].getTime() - now.getTime();
   if(times[i].getTime() > now.getTime() && tmpDiff < diff){
       closest = i;
   }
}

if(closest != -1){
    els[closest].addClass("closestClass");
}

这只是伪代码,这项任务的真正挑战是解析专有日期格式。

于 2012-12-04T08:26:32.790 回答
1

你应该用英文命名你的日期,因此“desember”......然后你可以遍历你的日期并从中创建 Date 对象,然后找到最接近的对象很容易。

var closest = [];

$('.wrap > .zone:eq(0) .box').each(function(i) {
    var date = $(this).find(".time").html().replace("(","").replace(")","");
        closest.push(new Date(date));
});

function closestTime(days, testDate)
{
    var bestDiff = null;

    for(i = 0; i < days.length; ++i){
        currDiff = Math.abs(days[i] - testDate);
        if(currDiff < bestDiff || bestDiff == null){
            bestDate = days[i];
            bestDiff = currDiff;
        } else if (currDiff == bestDiff && days[i] > testDate) {
            bestDiff = currDiff;             
        }
    }

    return bestDate;
}

console.log(closestTime(closest,new Date()));
于 2012-12-04T08:34:29.970 回答
1

只要您使用数组,这是实现它的最简单方法。

var closest = [];
// Current Date
var current = new Date("04/12/2012");
// Function to get the Minimam value in Array
Array.min = function( array ){
    return Math.min.apply( Math, array );
};
// Played on your code
$('.wrap > .zone:eq(0) .box').each(function(i) {
    var date = $(this).find(".time").html().replace("(","").split(".");
    // If higher than current date
    if(current.getDay() < date[0]) {
        closest.push(date[0]);
    }
});
// Get the closest day..
$("code").html(Array.min(closest)+"");

在您的演示中播放:http: //jsfiddle.net/BerkerYuceer/WJvZb/40/

于 2012-12-04T09:23:46.973 回答
1
    function findActive(days, testDate) {
        var bestDiff = 0;
        var bestDate = null;
        var strDate = "No active";

        for(i = 0; i < days.length; ++i){
            var dDate = getDate(days[i]);

            currDiff = Math.abs(dDate - testDate);

            if(i ==0){
                bestDiff = currDiff;
            }

            if(dDate <= testDate){
                if(currDiff < bestDiff){
                    strDate = days[i];
                    bestDate =  dDate;
                    bestDiff = currDiff;
                    }else if(currDiff == bestDiff){
                    strDate = days[i];
                    bestDate =  dDate;
                }
            }
        }
        return strDate;
    }


function getDate(strDate){
    var day  = strDate.substring(0,2);
    var month = strDate.substring(3,5);
    var year  = strDate.substring(6,10);

    return new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
}

date mask is: dd.MM.yyyy

        this code find active date. 
        enter code here
        example
        today is: 07.06.2013

        dates is: 03.06.2013, 4.6.2013, 5.6.2013 => return 5.6.2013
        dates is: 03.06.2013, 14.6.2013, 15.6.2013 => return 3.6.2013
        dates is: 08.06.2013, 14.6.2013, 15.6.2013 => return null
        dates is: 08.06.2013, 7.6.2013, 9.6.2013 => return 7.6.2013
        etc
于 2013-06-07T12:24:19.147 回答