頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


サマータイムがある所で不具合発生してた

なんだか2月になってからというもの海外のユーザーさんから、おめえのアプリがおかしい!2月が表示されねえぞ!ってメールが続いたんだよ。
アプリは「赤ちゃんの成長グラフ(Lite)」なんだ。赤ちゃんの身長や体重を入力する月ごとの表があるんだけど、2月が表示されず、1月の次が3月になるとか、、、
あるユーザーさんに使用環境とか聞いて試してみたら、あっさりと再現したんだよ、、、orz
そういえば前々からアプリのレビューで同じことを書いてる人もいたなあ、と今になって気付いたよ。このことだったんだ、って。

何が悪いんだって調べていくと、どうもフレームワークが悪いんじゃね?って思ってさ。しばらくほっといたら次のiOSのバージョンアップで直るパターンかな、なんて思ったんだよ。
でも、さらに調べるとバグじゃなくて仕様っぽい、、、いや、単に俺の勉強不足だね。どうやらメソッドが予想外の結果を返すのはサマータイムの影響みたい、ってことに落ち着いてさ。
なんとか昨日、修正版を申請したよ。でもまだリリースまでは時間がかかるだろうから、しばらくはどうなってんねん?!ってメールが届くのかなあ。


あまり一般的じゃないからコードは書いても仕方ないかもしれないけど、一応。
コード内で日付をNSDateオブジェクトとして持ってるんだよ。
ただ、意味があるのは年月日の数字だけで時間は関係ないので、"20120208"なんて文字列でもよかったりするんだけどね。
このNSDateオブジェクトは時間の情報が不要だから、次のようにして作っていたんだよ。
{
    NSDateComponents *comps1 = [[[NSDateComponents alloc] init] autorelease];
    [comps1 setYear:2012];
    [comps1 setMonth:2];
    [comps1 setDay:8];
    NSCalendar *calendar1 = [NSCalendar currentCalendar];
    [calendar1 setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    
    NSDate *date1 = [calendar1 dateFromComponents:comps1];
    
    NSLog(@"date1 : %@",date1);
]
ここでNSLogのアウトプットはこんなの → date1 : 2012-02-08 00:00:00 +0000
ともかく、こういうNSDateオブジェクトがあるとするね。

この日付の三ヶ月後が欲しいとするよ。
{
    //3ヶ月後を得る
    NSDateComponents *comps2 = [[[NSDateComponents alloc] init] autorelease];
    comps2.month = 3;
    NSCalendar *calendar2 = [NSCalendar currentCalendar];
    NSDate *date2 = [calendar2 dateByAddingComponents:comps2 toDate:date1 options:0];
    
    NSLog(@"date2 : %@",date2);
}
これでdateに対して三ヶ月後の日付を持つNSDateオブジェクトを得ることができるんだ。いや、できると思っていたんだよ、俺は。
実際、上のコードを実行するとたいていの人はこんな結果になると思う。

結果1

↑コンソール部分のスクショだけど、期待通り三ヶ月後の日付が表示されてる。
ところがこのコードだとサマータイムがある地域では具合が悪いんだよね。
iPhoneの設定アプリで
一般 / 日付と時刻 / 自動設定
をオフにして時間帯を他のところにしてみる。

時間帯を変更

↑シカゴにしてみた。不具合報告メールをくれた人がシカゴだったからで、行ったことも思い入れもないよ。 これで先ほどのコードを実行してみると、、、

結果2

↑サマータイム切り替え時をはさんでいるのがミソなんだけど、サマータイムが考慮されて1時間ずれてる。日付部分の数字を拾うとおかしなことになる、、、ってのが今回の不具合の要因だったんだよ。

サマータイムって切り替わるのが3月とか秋とかでしょ?
そういえば、USAのレビューに
OK...entered October and was hoping to see November, yet there wasn't one. Saw December twice....very useless.
なんて書いてたんだ。最初見た時はなんのこっちゃ?って感じだったけど、ようやく点と点がつながったよ。

[calendar2 setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
↑これを追加して期待通りのNSDateオブジェクトを得ることができたよ。

時間帯を変更することだけでチェックできるんだから今度から注意しようっと。


文章内で使う日付を今日にしたつもりが2012になってるのに今気が付いたよ。今は2013年だよね。ふう。

<< 修正版がリリース   TopPage  iOSでPOCに挑戦(3) 画像のデータを配列に入れる >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/733-f46b818b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad