Странная гибкая дата выпуска - PullRequest
1 голос
/ 27 июня 2009

Flex сводит меня с ума, и я думаю, что это странная ошибка, связанная с тем, как он справляется с високосными годами, а не с високосными. Итак, вот мой пример. У меня есть метод dateDiff ниже, который находит количество дней или миллисекунд между двумя датами. Если я выполню следующие три утверждения, у меня возникнут странные проблемы.

        dateDiff("date", new Date(2010, 0,1), new Date(2010, 0, 31));
    dateDiff("date", new Date(2010, 1,1), new Date(2010, 1, 28));
    dateDiff("date", new Date(2010, 2,1), new Date(2010, 2, 31));
    dateDiff("date", new Date(2010, 3,1), new Date(2010, 3, 30));

Если вы посмотрите на приведенные выше сравнения дат, вы получите 30, 27, 30, 29 в качестве количества дней между датами. Странная часть в том, что я получаю 29 при сравнении с 1 марта по 31 марта. Почему? Это как-то связано с февралем только 28 дней? Если у кого-либо есть какие-либо комментарии по этому вопросу, мы будем очень признательны.

public static function dateDiff( datePart:String, startDate:Date, endDate:Date ):Number 
    {
        var _returnValue:Number = 0;

        switch (datePart) {
            case "milliseconds":
                _returnValue = endDate.time - startDate.time;
                break;
            case "date":
                // TODO: Need to figure out DST problem i.e. 23 hours at DST start, 25 at end.
                // Math.floor causes rounding down error with DST start at dayOfYear
                _returnValue = Math.floor(dateDiff("milliseconds", startDate, endDate)/(1000 * 60 * 60 * 24));
                break;
        }

        return _returnValue;
    }

Ответы [ 2 ]

4 голосов
/ 29 июня 2009

Это не проблема високосного года, а проблема перехода на летнее время.

Чтобы исправить код для учета DST, вам нужно посмотреть на timezoneOffset обеих дат, чтобы определить, охватывает ли диапазон дат границу DST.

var adjustment:Number = ( startDate.timezoneOffset - endDate.timezoneOffset ) * 60 * 1000;
_returnValue = endDate.time - startDate.time + adjustment;

Это позволит получить разницу между двумя часовыми поясами (в минутах), преобразовать это значение в миллисекунды, а затем применить разницу часовых поясов к разнице в миллисекундах, чтобы "отменить" границу перехода на летнее время.

Естественно, когда оба числа находятся в одном часовом поясе, значение регулировки становится равным 0, а значения времени не регулируются.

0 голосов
/ 27 июня 2009

У вас есть часть ответа в вашем комментарии: 2010-Mar-01 0:00 до 2010-Mar-31 0:00 - это тридцать (!) Дней минус один час (потому что 14 марта - начало летнего времени в 2010 году). Так как вы получите результат вашего деления, вы получите 29.

Изменить: Этот ответ, конечно, основан на предположении, что свойство времени Date принимает во внимание DST. Это объяснило бы вашу проблему; Однако я этого не проверял.

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