Flickr api のas3flickrlibのバグ修正。

May 31, 2008

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

0 Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2012 Muraken.biz | powered by WordPress with Barecity