Welcome to TechNet Blogs Sign in | Join | Help

Shigeya Tanabe's blog

田辺茂也 (IT Pro エバンジェリスト)

News

  • 連絡先


    コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。

    お知らせ

    ブックマーク


    Clicky

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)}}

image

Posted: Monday, June 16, 2008 7:23 PM by Shigeya Tanabe
Filed under:

Comments

Shigeya Tanabe's blog said:

13日の金曜日、いかがお過ごしでしょうか。 昨年、PowerShell を使って Outlook の予定を作成しておいたので、しっかり昨日から、アラームが表示されていました。半年越しの仕込みが日の目を見ましたので、ここに記しておきたいと思います。

# February 13, 2009 3:12 AM
Anonymous comments are disabled
Page view tracker