不幸的是,这并不容易。Actionscript 中没有 timedelta 类(如 Python)。这使得查找日期之间的距离有点痛苦。如果您可以保证日期总是在同一个月内(例如,在给定月份内的 1-31),那还不错。然后你可以使用类似的东西:
package
{
import flash.display.Sprite;
public class TestXML extends Sprite
{
public function TestXML()
{
var xml:XML =
<a>
<u date="2009-04-10" value="543"/>
<u date="2009-04-11" value="234"/>
<u date="2009-04-13" value="321"/>
<u date="2009-04-14" value="66"/>
<u date="2009-04-16" value="234"/>
<t date="2009-04-01" value="43"/>
<t date="2009-04-02" value="67"/>
<t date="2009-04-03" value="432"/>
<t date="2009-04-08" value="123"/>
<t date="2009-04-09" value="65"/>
<l date="2009-04-01" value="12"/>
<l date="2009-04-02" value="76"/>
<l date="2009-04-03" value="123"/>
<l date="2009-04-04" value="6543"/>
<l date="2009-04-05" value="123"/>
<l date="2009-04-06" value="65"/>
<l date="2009-04-15" value="234"/>
<l date="2009-04-16" value="65"/>
</a>; // / // <-- need this for stack overflow parse bug :(
fillBlanks(xml, xml..u);
fillBlanks(xml, xml..t);
fillBlanks(xml, xml..l);
}
private function fillBlanks(rootNode:XML, list:XMLList):void
{
var dateString:String;
var matches:Array;
var currentDate:Date;
var lastDate:Date;
for each(var node:XML in list)
{
dateString = node.@date.toString();
matches = dateString.match(/(\d+)\-(\d+)\-(\d+)/);
currentDate = new Date(matches[1], matches[2], matches[3]);
while(lastDate && (currentDate.date - lastDate.date) != 1)
{
rootNode.insertChildBefore(node, new XML(
"<" + node.name() + " date=\"" +
lastDate.fullYear +
"-" +
lastDate.month +
"-" +
(lastDate.date + 1) +
"\" value=\"0\" />"));
lastDate = new Date(lastDate.fullYear, lastDate.month, lastDate.date + 1);
}
lastDate = currentDate;
}
}
}
}
这不会做一些花哨的事情,比如在月份或小于 10 的日期之前填充“0”。如果您的范围跨越月份障碍,它也将无法处理。第一个很容易修复,所以我把它留给你。第二个根本不是很容易(特别是如果日期也跨越年份),我再次将它留给你。