GrapeCity.devlog

グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の最新情報をお届けします。製品のTIPSや発売情報、イベントのお知らせなどをいち早く発信中です。

「元年」に対応した.NET Frameworkを試してみた

新元号への切り替えがあと半年余りと迫ってきましたね。

マイクロソフト社も新元号 (和暦) 対応に関するブログを公開するなど、今回の元号の切り替えに高い関心を示していましたが、それとは別の.NET Blog(英語)の方で、.NET Frameworkが「元年」の表記に対応することが2018年8月に予告されていたことをご存知でしたでしょうか。

この「元年」表記への対応ですが、先日公開の2018年10月の月例パッチでついに実装されました。

Windows 10の場合、KB4462932を適用することで対応できるようですので早速試してみました。
※2018年10月26日時点で、Windows 10のビルド1803や1809用のパッチは公開されておらず、後日公開の予定とコメントされています。

月例パッチの適用

検証環境

  • Windows 10 ビルド1709
  • Visual Studio 2017
  • .NET Framework 4.7.2

まずは月例パッチを適用します。前述のブログにリンクがあるのでそこから該当する環境のパッチを入手します。「Catalog」というリンクをクリックすると環境ごとに用意されたパッチの一覧が表示されるので、該当の環境のものをダウンロードして実行します。

f:id:GrapeCity_dev:20181024171726p:plain

無事にパッチがインストールされました。

f:id:GrapeCity_dev:20181024172548p:plain

.NET標準コントロールで「元年」を表示

パッチがインストールされたので、.NET標準のDateTimePickerで「元年」が表示されるか試してみます。フォーム上に以下のようにDateTimePickerを配置します。

f:id:GrapeCity_dev:20181025104714p:plain

以下のように日付の書式に"y年"と設定することで「元年」と表示できるようです。

サンプルコード(C#)

this.dateTimePicker1.Value = new DateTime(1989, 10, 22);

var calendarJP = new System.Globalization.JapaneseCalendar();
var cultureJP = new System.Globalization.CultureInfo("ja-JP");

cultureJP.DateTimeFormat.Calendar = calendarJP;

this.dateTimePicker1.CustomFormat 
     = this.dateTimePicker1.Value.ToString("ggy年M月d日", cultureJP);

実行すると「元年」が見事に表示

f:id:GrapeCity_dev:20181024175803p:plain

されませんでした・・・。

冒頭で紹介した2018年8月の.NET Blogの記事の中のサンプルコードを見ると、日付の書式に対して年、月、日をシングルクォートで囲っていました。月と日の表示は問題ないので、以下のように「年」だけシングルクォートで囲ってみます。

サンプルコード(C#)

// this.dateTimePicker1.CustomFormat 
//     = this.dateTimePicker1.Value.ToString("ggy年M月d日", cultureJP);
this.dateTimePicker1.CustomFormat 
     = this.dateTimePicker1.Value.ToString("ggy'年'M月d日", cultureJP);

今度は無事に「元年」が表示されました!

f:id:GrapeCity_dev:20181024180334p:plain

ちなみに「元年」表記となるのは、フォーマットを「ggy年」、または、「y年」とした場合に限られます。(つまり、「年」が後ろに付く場合のみ。)

以下の場合は元号抜きで「元年」だけ表示となります。

サンプルコード(C#)

this.dateTimePicker1.CustomFormat 
    = this.dateTimePicker1.Value.ToString("y'年'M月d日", cultureJP);

f:id:GrapeCity_dev:20181025105757p:plain

以下の場合は「元年」表記にはなりません。

サンプルコード(C#)

this.dateTimePicker1.CustomFormat
    = this.dateTimePicker1.Value.ToString("ggy.M.d", cultureJP);

f:id:GrapeCity_dev:20181025110149p:plain

グレープシティのツール製品で「元年」を表示

弊社の開発ツールの中には、「元年」を含めた和暦の表示を製品独自の機能として提供しているものと、.NET Frameworkの機能を使っているものの2種類があります。詳しくは、以下のページの「ナレッジベース情報」にまとめてありますのでご覧ください。

和暦の表示に.NET Frameworkの機能を使う製品の場合、これまでは.NET Frameworkが「元年」の表示に対応していなかったので、自動で「元年」の表示を行うことはできませんでしたが、このパッチを適用すれば.NET標準のコントロールと同様に「元年」が表示できるはずです。

今回は該当する製品から

  • ActiveReports for .NET(12.0J SP1以前)
  • SPREAD for ASP.NET
  • FlexGrid for WinForms(ComponentOne)

の3つをピックアップして検証してみたいと思います。

ActiveReports for .NET

ActiveReportsは12.0J SP2より、独自の和暦機能も提供していますが、それまでは.NET Frameworkの機能を使って和暦表示を実現していました。

今回はActiveReports for .NET 12.0J初版の環境で検証してみます。セクションレポートの例になりますが、.NET Frameworkの機能を使って和暦表示をする場合は以下のようになります。標準コントロール同様、「年」をシングルクォートで囲う必要があるので注意してください。

サンプルコード(C#)

private void detail_Format(object sender, EventArgs e)
{
    // カルチャの「言語-国/地域」を「日本語-日本」に設定します。
    System.Globalization.CultureInfo ci
        = new System.Globalization.CultureInfo("ja-JP");
    // 和暦を表すクラスです。
    System.Globalization.JapaneseCalendar jp
        = new System.Globalization.JapaneseCalendar();
    System.DateTime dt;

    // 現在のカルチャで使用する暦を、和暦に設定します。
    ci.DateTimeFormat.Calendar = jp;

    // TextBoxのデータを、DateTime型に変換します。
    dt = DateTime.Parse(this.txtOrderDate1.Text);

    // 「書式」「カルチャの書式情報」を使用し、文字列に変換します。
    this.txtOrderDate1.Text = dt.ToString("ggy'年'M月d日", ci);
}

実行すると以下のように「平成1年」のデータが自動的に「平成元年」と表示されました。

f:id:GrapeCity_dev:20181025143607p:plain

ちなみにSP2以降も、.NET Frameworkの機能を使用した和暦表示は同様に利用可能であり、上記のコードも有効です。

SPREAD for ASP.NET

検証環境はSPREAD for ASP.NET 10.0J SP3です。和暦表示をする場合のコードは以下のようになります。

サンプルコード(C#)

//日付書式にJapaneseCalendarを設定します
System.Globalization.DateTimeFormatInfo dinfo
    = new System.Globalization.CultureInfo("ja-JP").DateTimeFormat;
dinfo.Calendar = new System.Globalization.JapaneseCalendar();
//日付型セルに書式を設定します

// 2列目のデータを和暦で表示します。
FarPoint.Web.Spread.DateTimeCellType dateTimeCell
    = new FarPoint.Web.Spread.DateTimeCellType();
dateTimeCell.DateTimeFormat = dinfo;
dateTimeCell.FormatString = "ggy'年'M月d日";
FpSpread1.ActiveSheetView.Columns[1].CellType = dateTimeCell;

実行結果は以下です。

f:id:GrapeCity_dev:20181025143630p:plain

FlexGrid for WinForms

ComponentOneの場合、Input for WinFormsに収録されるC1DateEditを除き、.NET Frameworkの機能を使用して和暦を表示します。代表してFlexGrid for WinFormsで検証してみます。検証環境は2018Jv2です。

サンプルコード(C#)

private void Form1_Load(object sender, EventArgs e)
{
    // 2列目を日付型に設定
    c1FlexGrid1.Cols[2].DataType = typeof(DateTime);

    // オーナー描画
    c1FlexGrid1.DrawMode = C1.Win.C1FlexGrid.DrawModeEnum.OwnerDraw;
    c1FlexGrid1.AutoSizeCol(2);
    // JapanseCalendarクラスを使用
    c = new System.Globalization.CultureInfo("ja-JP");
    c.DateTimeFormat.Calendar
        = new System.Globalization.JapaneseCalendar();
}

private void c1FlexGrid1_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e)
{
    // 2列目を和暦で表示
    if ((e.Col == 2) && (e.Row > 0))
    {
        if (e.Text == "")
        {
            return;
        }
        // 表示データの設定(和暦表示)
        e.Text = DateTime.Parse(e.Text).ToString("ggy'年'M月d日", c);
    }
}

実行結果は以下です。

f:id:GrapeCity_dev:20181025143655p:plain

おわりに

今回の検証で、.NET Frameworkの機能を使って和暦表示を行っている製品は、2018年10月の月例パッチの適用により、「元年」表記に対応できることがわかりました。ただし、今回紹介した製品以外での動作確認は行っておりませんので、それ以外の製品のサポート状況などは弊社テクニカルサポートまでお問い合わせください。

またWebサイトにて弊社製品の新元号対応についての情報をまとめて公開しておりますので、あわせてご覧ください。