Flickr api のas3flickrlibのバグ修正。
days.Muraken.bizで使わせてもらってる、Adobe Systemsプレゼンツの
http://code.google.com/p/as3flickrlib/ のバグを発見。
現象としては今日days.Muraken.biz見たら4月の分が全部5月になってしまっていたという感じ。
叩いてるapi見たけどXMLのレスポンスは正常。
怪しそうな辺り調べてたら原因はここ。これはちょっと使ってる人はみんな直しておいたほうがいいと思います。
com.adobe.flickr.methodgroups.MthogGroupHelper
の266行目付近にある static な stringToDateというよくありそうなベタな関数なのだけど。
internal static function stringToDate( str:String = "" ):Date {
if ( str == "" ) {
return null;
}
var date:Date = new Date();
// split the date into date / time parts
var parts:Array = str.split( " " );
// See if we have the xxxx-xx-xx xx:xx:xx format
if ( parts.length == 2 ) {
var dateParts:Array = parts[0].split( "-" );
var timeParts:Array = parts[1].split( ":" );
date.setFullYear( dateParts[0] );
date.setMonth( dateParts[1] - 1 ); // subtract 1 (Jan == 0)
date.setDate( dateParts[2] );
date.setHours( timeParts[0] );
date.setMinutes( timeParts[1] );
date.setSeconds( timeParts[2] );
} else {
// Create a date based on # of seconds since Jan 1, 1970 GMT
date.setTime( parseInt( str ) * 1000 );
}
return date;
}
という感じになってます。
問題点は最初にdate = new Date()しちゃってそこに年数から順番にsetしてるとこ。
new Date()すると 今日の日付、時間がまずセットされちゃいます。
これだと今日、5月31日にnew Date()した場合、5月31日がセットされます。
そのあと、年は別にいいけど(うるう年除く)getMonth()で31日までない月をセットしちゃうとまずいことに。
var date:Date = new Date();//5月31にセットした場合 5月31日がセットされる。 date.setMonth(3);//4月をセット。この時点で/4月は31日ありませんので、自動的に繰り越して中身が5月に trace(date.getMonth();)//出力:4。
というわけで、こうならないようにするためには
とりあえずsetはやめてコンストラクタに引数で渡しましょう。
//date.setFullYear( dateParts[0] ); //date.setMonth( dateParts[1] - 1 ); // subtract 1 (Jan == 0) //date.setDate( dateParts[2] ); //date.setHours( timeParts[0] ); //date.setMinutes( timeParts[1] ); //date.setSeconds( timeParts[2] ); date = new Date(dateParts[0], (dateParts[1] - 1), dateParts[2], timeParts[0], timeParts[1], timeParts[2]);