NSDateで日付を比較

2013.09.18 Wednesday 00:44
0
    YouTubeからのWeb APIを使って、動画の情報を取得しました。
    動画の投稿日からの経過日数を取得するサンプルコードを書いてみました。

    ※動画情報の取得方法は今回は省略します。



    
    // 比較元の日付データの文字列
    NSString *old_date = @"2012-09-26T05:19:12.000Z";
    
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    [fmt setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.000'Z'"];
    [fmt setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"JP"]];
    [fmt setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"JST"]];
    
    
    // 比較元の日付をNSDate型に変換
    NSDate *tmpDate = [fmt dateFromString:old_date];
    
    // 現在日付を取得
    NSDate *now_date = [NSDate date]; 
        
    // 差を求める
    NSTimeInterval since = [now_date timeIntervalSinceDate:tmpDate];
    
    
    // 結果を表示
    NSLog(@"%d sec", (int)since);
    NSLog(@"%d day", (int)((int)since/(60*60*24)));
    


    実行結果

    30827468 sec
    356 day


    投稿日時が2012/09/26なのに対して、
    現在日時が2013/09/18なので、おおよそ予想通りの結果が求められました。

    NSDateに格納さえすれば、1行で時間の差が求められるんですね。
    けっこう便利に使えそうです。
    category:基本文法 | by:こもcomments(0) | - | -

    数値型を3桁でカンマ区切りにしてNSString型にする

    2013.09.17 Tuesday 17:51
    0
      数値型を3桁ごとにカンマ区切りにした文字列に変換する方法です。

      ググっても意外とよく分からなかったので、自分なりにまとめてみました。



      // 任意の数値
      int num = 1234567;
          
      // フォーマット定義
      NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
      [fmt setPositiveFormat:@",###"];
      
      // 数値を文字列に変換
      NSString *ret = [fmt stringForObjectValue:[NSNumber numberWithInt:num]];
      
      
      // 実行結果をログ表示
       NSLog(@"ret: %@", ret);
      
      



      実行結果:

      ret: 1,234,567


      意外と簡単にできました。
      category:基本文法 | by:こもcomments(0) | - | -

      ブログなどの日付データの変換

      2013.07.22 Monday 13:46
      0
        ブログのRSS情報を表示させるプログラムを書いていました。

        日付データには「Sat, 06 Jul 2013 10:23:40 GMT」などのような文字列が入っていて、日本人には馴染めません。

        ということで、これを日本人に読みやすい「2013/07/06 10:23:40」と表示するプログラムを書いてみました。



        下記のコードで、シミュレータで動かすとうまく動きました。

        が、いざ実機で動かすと、NSDateに変換時にnilが返ってくるという症状が発生しハマりました。


            // 任意の文字列
            NSString *instr = @"Sat, 06 Jul 2013 10:23:40 GMT";
        
            // 文字列をNSDateに変換して格納    
            NSDateFormatter *inpfmt = [[NSDateFormatter alloc] init];
        	[inpfmt setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
            NSDate *tmpDate = [inpfmt dateFromString:instr];
            
            // NSDateから自分の好きな文字列に変換
            NSDateFormatter *outFmt = [[NSDateFormatter alloc] init];
            [outFmt setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
            NSString *outstr = [outFmt stringFromDate:tmpDate];
        


        どうやら、setLocaleを設定しないとダメなようです。

           // 任意の文字列
            NSString *instr = @"Sat, 06 Jul 2013 10:23:40 GMT";
        
            // 文字列をNSDateに変換して格納    
            NSDateFormatter *inpfmt = [[NSDateFormatter alloc] init];
        	[inpfmt setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
            [inpfmt setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"US"]];
            NSDate *tmpDate = [inpfmt dateFromString:instr];
            
            // NSDateから自分の好きな文字列に変換
            NSDateFormatter *outFmt = [[NSDateFormatter alloc] init];
            [outFmt setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
            NSString *outstr = [outFmt stringFromDate:tmpDate];
        


        この一行を追加することによって、「2013/07/06 19:23:40」と出力が返ってきました。


        これで、

        「Sat, 06 Jul 2013 10:23:40 GMT」 →  「2013/07/06 19:23:40」

        変換ができました。


        9時間のずれがあるのは、元の文字列はGMT(グリニッジ標準時)なのに対して、手元の端末の設定がJST(日本標準時)なので、その時差ということなのでしょう。

        ……たぶん(^^;;

        category:基本文法 | by:こもcomments(0) | - | -

        NSUserDefaultsの保存処理でハマった

        2013.07.14 Sunday 14:32
        0
          NSUserDefaultsを使ったデータ保存で少しハマりました。

          基本的にリファレンスをちゃんと読んでいれば、こんなつまらないところでハマらなかったのでしょうが、一応メモとして残しておきます。



          NSUserDefaultsを使って整数型のデータを保存し、それを読むコードを書いていました。
          これをデバッガー上で動作させていました。



          
          
          - (id)init
          {
              if(self == [super init]) {
                  m_userDefaults = [NSUserDefaults standardUserDefaults];
              }
          	
              return self;
          }
          
          
          // 保存
          - (BOOL) saveData:(int)val
          {
          
              [m_userDefaults setInteger:val forKey:@"KEY_DATA"];
          
              return(YES);
          }
          
          // 読み出し
          - (int) loadData 
          {
              int val = [m_userDefaults integerForKey:@"KEY_DATA"];
          
              return(val);
          }
          
          



          最初は自分が思った通りに動作していたのですが、あるタイミングでデータがうまく保存されない症状がでました。

          アプリを普通に動かしている時は全然問題ないのでが、データの保存処理を行った直後にxcode上からアプリを終了し、すぐにアプリを再起動するとデータが保存されていないことがありました。



          ……どうやらすぐに保存処理を実行して欲しい場合は、synchronizeで同期させてあげないとダメみたいですね。


          ということで、synchronizeを追加してみました。


          
          - (id)init
          {
              if(self == [super init]) {
                  m_userDefaults = [NSUserDefaults standardUserDefaults];
              }
          	
              return self;
          }
          
          
          // 保存
          - (BOOL) saveData:(int)val
          {
          
              [m_userDefaults setInteger:val forKey:@"KEY_DATA"];
          
              BOOL ret = [m_userDefaults synchronize];
          
              return(ret);
          }
          
          // 読み出し
          - (int) loadData 
          {
              int val = [m_userDefaults integerForKey:@"KEY_DATA"];
          
              return(val);
          }
          


          こうすることによって、xcode上からアプリを落としても値が反映されているようになりました。

          synchronizeを省略すると、OSの都合のいいタイミングによって保存されるみたいです。
          それをxcode上からアプリを強制的に止めたものだから、保存の部分の同期処理が走っていなかったと思われます。

          つまらんところでハマってしまいました(^^;;
          category:基本文法 | by:こもcomments(0) | - | -

          NSMutableArrayにてオブジェクトを並び替える

          2013.06.10 Monday 16:03
          0
            リストの中身を並べ変える処理について調べてみました。

            ググってもなんかよく分からんので、適当にsortUsingComparatorを使ってみました。


            まずはオブジェクトを定義。
            NSObjectから派生したItemInfoという情報クラスを任意のクラスを作ってみました。


            @interface ItemInfo : NSObject
            {
            @public
                int Index;          // インデックス
                NSString *Name;	// 名前
                int Num;            // 個数
            }
            @end
            
            


            で、それを個数の多い順にソートしてみます。

                NSMutableArray *itemList = [NSMutableArray array];
            
                // apple 3個
                ItemInfo *item = [[ItemInfo alloc] init];
                item->Index = 0;
                item->Name = @"apple";
                item->Num = 3;
                [itemList addObject:item];
            
                // orange 5個
                ItemInfo *item2 = [[ItemInfo alloc] init];
                item2->Index = 1;
                item2->Name = @"orange";
                item2->Num = 5;
                [itemList addObject:item2];
            
                // banana 4個
                ItemInfo *item3 = [[ItemInfo alloc] init];
                item3->Index = 2;
                item3->Name = @"banana";
                item3->Num = 4;
                [itemList addObject:item3];
            
                // リストをログ表示
                NSLog(@"-----------sort 前----------------");
                for (ItemInfo* item in itemList) {
                    NSLog(@"name: %@", item->Name);
                }
            
                // リストをソート処理
                [itemList sortUsingComparator:^(id obj1, id obj2) {
                    ItemInfo* inf1 = (ItemInfo*)obj1;
                    ItemInfo* inf2 = (ItemInfo*)obj2;
                    
                    if(inf1->Num > inf2->Num){
                        return(NSOrderedAscending);
                    }
                    if(inf1->Num < inf2->Num){
                        return(NSOrderedDescending);
                    }
                    return (NSOrderedSame);
                }];
            
                // リストをログ表示
                NSLog(@"-----------sort 後----------------");
                for (ItemInfo* item in itemList) {
                    NSLog(@"name: %@", item->Name);
                }
            


            [実行結果]

            -----------sort 前----------------
            name: apple
            name: orange
            name: banana
            -----------sort 後----------------
            name: orange
            name: banana
            name: apple


            個数の多い順にちゃんとソートされていました。
            とりあえず、こんな感じでいいのかな?(^^;;
            category:基本文法 | by:こもcomments(0) | - | -

            Calender
                123
            45678910
            11121314151617
            18192021222324
            252627282930 
            << June 2017 >>
            Sponsored Link
            Selected entry
            Category
            Archives
            Recent comment
            • NSUnknownKeyExceptionが出た時の回避方法
            • NSUnknownKeyExceptionが出た時の回避方法
              atsushi
            • NSUnknownKeyExceptionが出た時の回避方法
              kanejun
            • UITableViewCellに置いたボタンのイベント処理
              こも
            • UITableViewCellに置いたボタンのイベント処理
              かつお
            • NSUnknownKeyExceptionが出た時の回避方法
              こも
            • NSUnknownKeyExceptionが出た時の回避方法
               
            • iOS7のベータ版を入れてみた
              こも
            • iOS7のベータ版を入れてみた
              梅雨
            • iOS7のベータ版を入れてみた
              こも
            Sponsored Link
            Link
            Profile
            Search
            Others
            Mobile
            qrcode
            Powered
            無料ブログ作成サービス JUGEM