13日は何曜日?
先週の金曜日って13日だったんですね。ということに週末気付き、曜日感覚というか日付感覚の無さが判明した次第です。
さて、過ぎてしまうと次が気になるもの。今後13日が金曜日になるのはいつなのか、Windows PowerShell を使って調べてみました。
まずは日付の取り扱いから。.NET Framework の DateTime 型を使うのが便利です。文字列から DateTime 型に変換すれば、日付特有の操作が簡単にできます。
文字列を DateTime 型にキャストしてみます。戻り値が DateTime 型として表示されています。
psh> [DateTime]”2008/6/13”
2008年6月13日 0:00:00
曜日を示すプロパティ DayOfWeek を調べます。
psh> ([DateTime]”2008/6/13”).DayOfWeek
Friday
たしかに金曜日です。Get-Member でどのようなプロパティがあるか調べられますが、DayOfWeek の値は System.DayOfWeek という列挙体です。文字列または数値で扱うことができます。数値の場合は日曜日の 0 から始まります。
psh> ([DateTime]"2008/6/13").DayOfWeek -eq "Friday"
True
psh> ([DateTime]"2008/6/13").DayOfWeek -eq 5
True
また標準の表示形式では曜日が表示されませんので、日付の書式指定を使って表示してみます。1つめは標準書式を、2つめはカスタム書式を指定しています。
psh> ([DateTime]"2008/6/13").ToString("r")
Fri, 13 Jun 2008 00:00:00 GMT
psh> ([DateTime]"2008/6/13").ToString("yyyy/MM/dd dddd")
2008/06/13 金曜日
さて、では今後6か月について、13日が何曜日になるか見てみましょう。2008/6/13 を起点として、1月ずつ足していきます。AddMonths() というメソッドで月を足します。1から6のリストをパイプで ForEach-Object のループに渡しています。% は ForEach-Object の短縮形 (エイリアス) です。(表示上2行になっていますが、実際は1行です。)
psh> 1..6 | %{([DateTime]"2008/6/13")
.AddMonths($_).ToString("yyyy/MM/dd dddd")}
2008/07/13 日曜日
2008/08/13 水曜日
2008/09/13 土曜日
2008/10/13 月曜日
2008/11/13 木曜日
2008/12/13 土曜日
今年はもう金曜日にはならないようです。ではこの先50か月ではどうでしょうか。ループ内で、各月13日の日付を一旦 $d に保存し、金曜日の場合だけ表示します。1行で書いていると、だんだん見づらくなってきますが…
psh> 1..50 | %{$d = ([DateTime]"2008/6/13").AddMonths($_);
if($d.DayOfWeek -eq 5)
{$d.ToString("yyyy/MM/dd dddd")}}
2009/02/13 金曜日
2009/03/13 金曜日
2009/11/13 金曜日
2010/08/13 金曜日
2011/05/13 金曜日
2012/01/13 金曜日
2012/04/13 金曜日
2012/07/13 金曜日
多い年と少ない年がありますね。次回は来年ですが、来年になったらまた忘れてしまっていると思いますので、Outlook の予定表に追加しておくことにします。Outlook の予定表のスクリプティングについては、Script Center の記事を参考にしました。(VBScript の記事です。)
まずは Outlook を扱うための COM オブジェクトを作成します。
$ol = New-Object -com outlook.application
新しい予定を作るには Outlook で新しいアイテムを作成して、内容をセットして保存します。CreateItem() の引数の 1 で予定の作成を指定しています。一連の作業を関数として定義しておきます。
上から順に、引数は日付、予定アイテムの作成、終日の予定の指定、日付の指定、件名の指定、本文の指定、予定アイテムの保存を行っています。3行目の $ol は Outlook のオブジェクトで、あらかじめ作成しておく必要があります。
function new-schedule {
param([DateTime]$date)
$sch = $ol.CreateItem(1)
$sch.AllDayEvent = $true
$sch.start = $date
$sch.subject = "13日の金曜日"
$sch.body = "静かに過ごす"
$sch.Save()
}
以下のようにして、今後50か月の予定を作成しておくことができます。
psh> $ol = New-Object -com outlook.application
psh> 1..50 | %{$d = ([DateTime]"2008/6/13").AddMonths($_);
if($d.DayOfWeek -eq 5){new-schedule($d)}}
