カスタム日時形式文字列内で文字列を明示して表現する

カスタム日時形式文字列内で文字列を明示して表現するコードを紹介します。

概要

DateTime.ToString() メソッドでカスタム日時形式文字列を利用すると指定した形式で時刻や日時を整形した文字列を取得できます。 カスタム日時形式文字列で文字列を表現しようとした場合、フォーマットの文字と衝突してしまうことがあります。 この記事では、カスタム日時式文字列で明示的に文字列を表現する方法を紹介します。

書式

カスタム日時形式文字列の "リテラル文字列" を利用します。書式は次の通りです。

"(表現する文字列)"

または

'(表現する文字列)'

プログラム例

最初に書式指定文字と衝突する例のコードを記述して動作を確認します。

UI

Windows フォームアプリケーションを作成し下図のフォームを作成します。
カスタム日時形式文字列内で文字列を明示して表現する:画像1

コード

下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LiteralStringDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string dtstr = DateTime.Now.ToString("Year:yyyy - Month:MM - Day:dd");
      textBox1.Text = dtstr;
    }
  }
}

実行結果

プロジェクトを実行します。下図のフォームが表示されます。
カスタム日時形式文字列内で文字列を明示して表現する:画像2

[Test1]ボタンをクリックします。テキストボックスに文字列が表示されます。
カスタム日時形式文字列 で"Month" と表示したいですが、"M"の文字が日時の「月」の書式、"t"の文字が時刻の「AM/PM 指定子の最初の文字」の書式、"h"の文字が時刻の「時」の書式のため、"Month"ではなく (分)on(AM/PM 指定子の最初の文字)(時)という表示になってしまいます。

また、"Day" の部分の表示も "y"の文字が西暦年の下2桁を表すため、"Day"ではなく Da(西暦の下2桁)という表示になってしまいます。
カスタム日時形式文字列内で文字列を明示して表現する:画像3

プログラム例 (修正)

コードを修正します。

UI

下図のフォームを作成します。先ほどのフォームにボタンを一つ追加します。
カスタム日時形式文字列内で文字列を明示して表現する:画像4

コード

以下のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LiteralStringDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    }

    private void button1_Click(object sender, EventArgs e)
    {
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string dtstr = DateTime.Now.ToString("\"Year:\"yyyy - \"Month:\"MM - \"Day:\"dd");
      textBox1.Text = dtstr;
    }
  }
}

解説

カスタム日時形式文字列で明示的に文字列として表示したい文字を 「"」で囲むことで、書式指定の文字列ではなく表示する文字列として明示できます。
「"」は文字列の開始、終端を示す記号のため文字列内に記述する場合は 「\"」と記述します。

補足
文字列の前に「@」が付加される場合 (逐語的文字列リテラル)の場合は、「""」で「"」を表現します。
    private void button2_Click(object sender, EventArgs e)
    {
      string dtstr = DateTime.Now.ToString("\"Year:\"yyyy - \"Month:\"MM - \"Day:\"dd");
      textBox1.Text = dtstr;
    }


「'」(シングルクォート)で囲むことでもリテラル文字列を表現できますので、下記のコードでも同様に動作します。

    private void button2_Click(object sender, EventArgs e)
    {
      string dtstr = DateTime.Now.ToString("'Year:'yyyy - 'Month:'MM - 'Day:'dd");
      textBox1.Text = dtstr;
    }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
カスタム日時形式文字列内で文字列を明示して表現する:画像5

[Test2]のボタンをクリックします。テキストボックスに文字列が表示されます。 シングルクォートやダブルクォートで囲んだ Year Month Day が文字列として表示できていることが確認できます。
カスタム日時形式文字列内で文字列を明示して表現する:画像6


AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2020-12-29
Copyright © 1995–2025 iPentec all rights reserverd.