需要一系列日期从1月1日到12月31日

时间:2009-01-19 18:37:55

标签: flex actionscript-3

如何在ActionScript 3中创建一个日期数组,每天一个,从2008年1月1日到2008年12月31日?

如果它适用于任何日期范围,那将是理想的...

5 个答案:

答案 0 :(得分:5)

这个怎么样:

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类处理每月天数,闰年等的实际问题。

可能有更好的方法可以做任何要求你有一系列日期的事情,但我确信我之前因为合法的原因使用了这样的东西。

答案 1 :(得分:3)

只是想知道为什么你需要一系列日期。不是说它可能没有充分的理由,但它似乎有点奇怪。如果你有一个开始和结束日期,那么可能有更好的方法来做你正在尝试做的事情。还有更多信息吗?

答案 2 :(得分:1)

我需要两个日期之间的天数,因为我的应用程序有一个带有2个拇指的自定义hSlider,允许用户更改他们希望将数据绑定到的日期范围。 (想想谷歌财务)......

我的解决方案:

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]));

答案 3 :(得分:1)

显然这可能不适合您的应用程序,但为了论证,如果我想要一个控制给定范围内的日期值的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}" />

这样我就不必创建所有日期的数组。显然,如果你在日期只需要一定的准确性,那么你需要一些额外的逻辑来上下调整日期。

答案 4 :(得分:0)

没有什么好看的:只需使用两个for循环,内循环检查月份索引(“三十天有九月,四月,六月和十一月”)并计算闰年(我相信今年是一年) ,记住ActionScript的Date对象在几天内不使用从零开始的索引(虽然它确实持续数月):

<?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>

有意义吗? (如果有更优雅的方式,我就不知道了。)