2014年1月25日土曜日

東芝dynabook tab VT484で、曜日ベース日付リスト表示コマンド作ってみました

私事ですが、以前から家族が「2月の第三火曜日って何日だっけ?」という感じで、"第n週のx曜日はいつか?"を頻繁に聞いてくるので、「東芝dynabook tab VT484」のWindows PowerShellでもって、曜日ベースの日付リスト表示コマンドを作ってみました。


コマンド名はWEEKLISTとしました。

パラメータは、 年月(年=yyyy, 年月=yyyyMM)と 曜日(0=日,1=月,2=火,3=水,4=木,5=金,6=土 ※数値も日本語名どちらも可)の2つを指定するようにしました。

たとえば、2014年2月の土曜日の日付リストが欲しければ

WEEKLIST 201402 土 (WEEKLIST 201402 6でも可)

とすれば、結果が画像のように返ってきます。


パラメータの年月部分に年だけ指定すれば、一気に指定年の一覧が出力される仕組みになっています。

これを見ると、冒頭の家族からの質問にもすぐに答える事が出来るかなーと。



参考までに
PowerShellを使えるように設定する記事はこちらです
■コマンドのコード内容

ちなみに、作りながら試して知ったのですが、PowerShellって、C#言語のようにジェネリッククラスのlistが使えるんですね。

$gREC = $(NEW-OBJECT System.Collections.Generic.List[string]);

で初期化しといて・・・

$gREC.Add(値);

で値を追加出来るんですね。

ちなみに、[void]$oREC.Add(値);のように[void]でコマンド画面への出力を抑制する必要は無かったです。

#曜日ベースの日付リスト表示
FUNCTION GLOBAL:WEEKLIST($P_DATE="",$P_WEEK="")
{
   $iMODE      = [int16]0; #処理モード
   $iWEEK      = [int16]0; 
   $iCURRENT   = [int16]0; #カレント週
   $i          = [int32]1; #曜日週数初期化
   $iBREAK_KEY = [int32]-1; #ブレイクキーエリア
   $iEND_KEY   = [int32]-1; #終了値
   $iEND       = [int16]0;  #終了フラグ
   $oRX1       = $(NEW-OBJECT Regex("^[0-9]{4}$"));
   $oRX2       = $(NEW-OBJECT Regex("^[0-9]{6}$"));
   $oRX3 = $(NEW-OBJECT Regex("^[0-6]{1}|日|月|火|水|木|金|土$"));
   $oDUMMY     = $(NEW-OBJECT DateTime); #日付チェック用
   $iDUMMY     = [int32]0; #数値チェック用
   $sDATE      = [String]$P_DATE; #処理開始日エリア初期化
   $sREC       = ""; #出力用情報エリア
   #出力オブジェクト(ジェネリッククラスによる動的文字列型配列)
   $gREC       = $(NEW-OBJECT System.Collections.Generic.List[string]);
   if($oRX1.IsMatch($P_DATE))
   {
      $iMODE = 1; #年モード
      $sDATE = $sDATE + "-01-01"; #処理開始日セット
   }
   elseif($oRX2.IsMatch($P_DATE))
   {
      $sDATE = $sDATE.SubString(0,4) + "-" + $sDATE.SubString(4,2) + "-01";
      #入力年月が正当かどうかチェック
      if(![DateTime]::TryParse($sDATE,[ref]$oDUMMY))
      {
         WRITE-OUTPUT ("入力された年月が不正です。");
         RETURN; #強制終了
      }
      $iMODE = 2; #年月モード
   }
   if($iMODE -eq 0 -or !$oRX3.IsMatch($P_WEEK))
   {
      WRITE-OUTPUT ("パラメータは 年月(年=yyyy, 年月=yyyyMM) 曜日(0=日,1=月,2=火,3=水,4=木,5=金,6=土 ※数値も日本語名どちらも可)");
      RETURN; #強制終了
   }
   #曜日パラメータの取得
   if([int16]::TryParse($P_WEEK,[ref]$iDUMMY))
   {   #曜日が数値の場合はそのまま取得
       $iWEEK = [int16]$P_WEEK;
   }
   else
   {  #日本語名の場合は自作関数で数値に変換
      $iWEEK = [int16](WEEKNAME $P_WEEK);
   }
   $aDATE = $sDATE.Split("-"); #日付の年月日要素分解
   $oDATE = $(NEW-OBJECT DateTime($aDATE[0],$aDATE[1],$aDATE[2]));
   $iEND_KEY = $oDATE.Year*100 + $oDATE.Month; #終了年月セット
   #@@@@@@@@@@[LOOP-START]@@@@@@@@@@
   while($iEND -eq 0) #終了フラグが0の間はループ
   {
      $iCURRENT = [int16]($oDATE.DayOfWeek.ToString("d")); #カレント曜日
      if($iCURRENT -eq $iWEEK)
      {
         $sREC = $oDATE.Year.ToString("0000") + "年,";
         $sREC+= $oDATE.Month.ToString("00") + "月,";
         #自作関数で曜日数値を曜日名に変換
         $sREC+= "第" + $i.ToString() + (WEEKNAME $iCURRENT) + "曜日,";
         $sREC+= $oDATE.ToString("yyyy-MM-dd");
         #WRITE-OUTPUT ($sREC);
         $gREC.Add($sREC); #出力リストに追加
         $i++; #曜日週数のカウントアップ
      }
      $oDATE = $oDATE.AddDays(1); #1日日付をアップ
      if($iMODE -eq 1)
      {  #年モード時
         if($oDATE.Year -ne [Math]::floor($iEND_KEY/100))
         {  #年がキー・ブレイクしたら終了
            $iEND = 1;
         }
         else
         {
            if($oDATE.Year*100+$oDATE.Month -ne $iBREAK_KEY)
            {  #年月がキー・ブレイク時
               $sREC = "-----,-----,-----,-----";
               $gREC.Add($sREC);
               $i = 1; #曜日週数の初期化
               $iBREAK_KEY = $oDATE.Year*100+$oDATE.Month;
            }
         }
      }
      else
      {  #年月モード
         if($oDATE.Year*100+$oDATE.Month -ne $iEND_KEY)
         {  #年月がキー・ブレイクしたら終了
            $iEND = 1;
         }
      }
   }
   #@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
   
   #出力
   RETURN $gREC;
}

FUNCTION GLOBAL:WEEKNAME($P_VALUE="")
{
   $sRES = "";
   switch($P_VALUE)
   {
      "0"  {$sRES = "日"; }
      "1"  {$sRES = "月"; }
      "2"  {$sRES = "火"; }
      "3"  {$sRES = "水"; }
      "4"  {$sRES = "木"; }
      "5"  {$sRES = "金"; }
      "6"  {$sRES = "土"; }
      "99" {$sRES = "ALL";}
      "日" {$sRES = "0";  }
      "月" {$sRES = "1";  }
      "火" {$sRES = "2";  }
      "水" {$sRES = "3";  }
      "木" {$sRES = "4";  }
      "金" {$sRES = "5";  }
      "土" {$sRES = "6";  }
      "ALL"{$sRES = "99"; }
      
      default{$sRES="?"; }
    }
    RETURN $sRES;
}
このコードはさすがにちょっとだけ長かったんで、マイクロソフトウェッジモバイルキーボードを接続して入力しましたー。

このキーボード本当に入力しやすい!!!!