Нужен массив дат с 1 января по 31 декабря - PullRequest
0 голосов
/ 19 января 2009

Как создать массив дат, по одной на каждый день, начиная с 1 января 2008 г. по 31 декабря 2008 г. в ActionScript 3?

Было бы идеально, если бы он работал в любом диапазоне дат ...

Ответы [ 5 ]

5 голосов
/ 19 января 2009

Как насчет этого:

function getDateArray(start:Date, end:Date):Array
{
    var result:Array = new Array();
    var iter:Date = new Date(start); //you could remove or standardise time info here
    while (iter <= end)
    {
        result.push(new Date(iter));
        iter.setDate(iter.getDate() + 1);
    }
    return result;
}

Пусть в классе AS3 Date рассматривается вопрос о количестве дней в месяце, високосных годах и т. Д.

Возможно, есть лучший способ сделать то, что требует от вас, чтобы у вас был массив дат, но я уверен, что раньше использовал что-то подобное по законным причинам.

3 голосов
/ 19 января 2009

Просто интересно, зачем вам нужен массив дат. Не сказать, что, вероятно, нет веской причины для этого, но это кажется немного странным, вот и все. Если у вас есть дата начала и окончания, то, скорее всего, есть лучший способ сделать то, что вы пытаетесь сделать. Больше информации?

1 голос
/ 20 января 2009

Очевидно, что это может не соответствовать вашему приложению, но ради аргументов, если бы я хотел иметь hSlider, который контролировал бы значение даты в данном диапазоне, я бы установил ползунок вверх, чтобы он возвращал значение от 0 до 1, и использовал что в процентах миллисекунд между двумя датами. Примером этого может быть:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
    <![CDATA[
        import mx.events.SliderEvent;

        private static var START_DATE : Date = new Date(2009,0);
        private static var END_DATE : Date = new Date(2010,0);

        [Bindable]
        protected var currentDate : Date;

        protected function dateSliderChangeHandler(event : SliderEvent) : void
        {
            var differenceInMilli : Number = END_DATE.time - START_DATE.time;
            var percantageMilli : Number = differenceInMilli * event.value;
            var currentDateInMilli : Number = START_DATE.time + percantageMilli;

            currentDate = new Date(currentDateInMilli);
        }

    ]]>
</mx:Script>


<mx:HSlider id="dateSlider" 
    width="200" 
    minimum="0"
    maximum="1"
    change="dateSliderChangeHandler(event)" />
<mx:Label text="{currentDate}" />

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

1 голос
/ 20 января 2009

Мне понадобился массив дней между двумя датами, потому что в моем приложении есть собственный hSlider с двумя большими пальцами, который позволяет пользователю изменять диапазон дат, с которыми он хочет связать данные. (думаю, Google Finanace) ...

Мое решение:

var startDate:Date = Application.application._model.minDate;
        var endDate:Date = Application.application._model.maxDate;

        var timespan:Number = endDate.getTime() - startDate.getTime();
        var aDay:Number = 86400000;
        var days:Number = timespan / aDay;
        dateData.length = 0;
        var i:int = 0;
        dateData.push(new Date(startDate));
        dateData.push(new Date(endDate));

        for(i = 0; i < days; i++){
            var newDate:Date = new Date(startDate.getTime() + i * aDay);
            dateData.push(newDate);
        }

        slider.setThumbValueAt(0, Number(dateData[0]));
        slider.setThumbValueAt(1, Number(dateData[i]));
0 голосов
/ 19 января 2009

Ничего особенного в этом нет: просто используйте два цикла for, с внутренним циклом, проверяющим индекс месяца («Тридцать дней с сентября, апрель, июнь и ноябрь») и учитывающим високосный год (я считаю, что этот год один) запоминание объекта Date в ActionScript не использует индексы, начинающиеся с нуля, в течение нескольких дней (хотя и в течение нескольких месяцев):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="app_init()">
    <mx:Script>
        <![CDATA[

            private function app_init():void
            {
                var dates:Array = new Array();

                for (var month:int = 0; month < 12; month++)
                {
                    for (var day:int = 1; day <= 31; day++)
                    {
                        var date:Date = new Date(2008, month, day);

                        // 30 days has September (8), April (3), June (5) and November (10)...  
                        if ((month == 8 || month == 3 || month == 5 || month == 10) && day == 31)
                        {
                            break;
                        }
                        // Leap year                        
                        else if (month == 1 && day > 29)
                        {
                            break;
                        }

                        dates.push(date);
                    }
                }

                for each (var d:Date in dates)
                {
                    trace(d);
                }
            }

        ]]>
    </mx:Script>
</mx:Application>

Имеет смысл? (Если есть более элегантный способ, я не знаю об этом.)

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