AS2: рассчитать дни между двумя датами - PullRequest
1 голос
/ 01 сентября 2011

В настоящее время я использую этот скрипт, чтобы определить разницу между двумя датами:

// Slide_Tracker[?].date_int are results from the built in function getTime()
var current_date = new Date(Slide_Tracker[i].date_int);
var past_date:Date = new Date(Slide_Tracker[i - 1].date_int);
var date_diff:Number = Math.round((current_date - past_date) / 86400000);

Проблема в том, что я хочу отслеживать фактическое изменение физического дня, поэтому, если кто-то получит доступ к приложению в 23:59, а затем вернется через 5 минут, это будет записано как разница в 1 день (новый день) текущий сценарий требует, чтобы между двумя датами прошло не менее 12 часов, чтобы он зарегистрировался как новый день.

Я думал об использовании номера даты и т. Д., Но, поскольку месяцы и годы настолько различны, это довольно сложный маршрут, должно быть что-то более простое.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Как к вашему сведению, разница между датой и полуночью следующего дня:

// dt is the start date
var diff:Number = 
      new Date(dt.getYear(), dt.getMonth(), dt.getDate() + 1) - dt.getTime()

Но проще всего просто округлить до следующего дня, а затем начать оттуда:

var dt:Date = new Date(Slide_Tracker[i - 1].date_int);
var past_date = // start at the next day to only deal w/ 24 hour increments
    new Date(dt.getYear(), dt.getMonth(), dt.getDate() + 1);
dt = new Date(Slide_Tracker[i].date_int);
var current_date = 
    new Date(dt.getYear(), dt.getMonth(), dt.getDate() + 1);
var date_diff:Number = Math.round((current_date.getTime() - 
                                   past_date.getTime()) / 86400000);

Другой вариант - округлить значения:

// rounds a timestamp *down* to the current day
function getBaseDay(val:Number):Number
{
    return Math.floor( val / 86400000 ) * 86400000
}

var current_date = new Date(getBaseDay(Slide_Tracker[i].date_int));
var past_date:Date = new Date(getBaseDay(Slide_Tracker[i - 1].date_int));
var date_diff:Number = Math.round((current_date.getTime() - 
                                   past_date.getTime()) / 86400000);
0 голосов
/ 01 сентября 2011

Примерно так должно работать:

public boolean isNewDay( current:Date, past:Date ):Boolean
{
    // check the days of the month first
    if( current.date != past.date )
        return true;

    // check the months in case they came back on the same day of the next month
    if( current.month != past.month )
        return true;

    // finally check the year, in case they came back on the same day the next year
    if( current.fullYear != past.fullYear )
        return true;

    return false;
}

даже если вы приняли ответ, вот функция обновления:

public function getNumberOfDays( current:Date, past:Date ):int
{
    // get the number of millis between the two dates
    var millis:Number = current.time - past.time;

    // a day in millis is 1000 (s) * 60 (m) * 60 (h) * 24 (day)
    var day:Number = 1000 * 60 * 60 * 24;

    // get the number of days
    var numDays:int = int( millis / day );

    // create midnight of the current day
    if ( numDays == 0 )
    {
        // if our numDays is 0, check if the current date is after midnight and the
        // previous date was before midnight the previous day, in which case, count
        // it as another day
        var midnight:Date = new Date( current.fullYear, current.month, current.date );
        if ( current.time > midnight.time && past.time < midnight.time )
            numDays++;
    }

    return numDays;
}

Работает со всеми тестами, которые я пробовал (от полуночи до 23,59,59 = 0 дней, от 23,59 до 00,05 = 1 день)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...