連載
» 2015年11月24日 05時00分 UPDATE

.NET TIPS:日付や時刻を文字列に変換するには?

DateTime構造体を介して得られる日付や時刻を、標準書式指定/カスタム書式指定文字列を使用して文字列に変更する方法を解説する(C# 6.0/VB 14対応)。

[遠藤孝信, かわさきしんじ,共著]
.NET TIPS
Insider.NET

 

「.NET TIPS」のインデックス

連載目次

本稿は2004/08/27に初版公開、2004/09/02に改訂された記事を再改訂し、C# 6.0/Visual Basic 14(以下、VB 14)の補完文字列についての記述を追加したものです。また、本稿のコードは全てC# 6.0/VB 14で動作を確認しました。


 .NET Frameworkのクラスライブラリでは、日付や時刻の情報は、DateTime構造体(System名前空間)を使って扱うことができる。本稿では、このDateTimeオブジェクトを指定した形式の文字列に変換するための基本的な方法について示す。

 また、C# 6.0/VB 14では、「補間文字列」(interpolated string)という機能を使うことで、同じ内容のコードをより簡潔に記述することも可能だ。補間文字列を使用したコードを知りたい方はこちらを参照してほしい。

標準書式指定とカスタム書式指定

 DateTime構造体には、日付や時刻の情報を文字列に変換するために、大きく次の三つの方法がある。

(1) ToLongDateString、ToLongTimeString、ToShortDateString、ToShortTimeStringなどのメソッドを呼び出す

(2) 標準書式指定文字列(d、D、t、T、f、F、g、Gなど)をパラメーターに指定して、ToStringメソッドを呼び出す

(3) カスタム書式指定文字列(後述)をパラメーターに指定して、ToStringメソッドを呼び出す

 (1)に挙げたメソッドは、(2)の方法によるToString("D")、ToString("T")、ToString("d")、ToString("t")などの呼び出しを置き換えたにすぎない(標準書式指定文字列については、MSDNの「標準の日時書式指定文字列」を参照)。いずれにせよ、(1)(2)の方法はカルチャ情報に依存した文字列が出力される。つまり、例えば、以下のコードを実行すると、その結果が日本語環境では「2004年8月24日 20:23:06」などになるが、英語環境では、これは「Tuesday, August 24, 2004 8:23:06 PM」といった値となる。

DateTime.Now.ToString("F")

現在の時刻を完全な日付と時刻のパターン(長い形式の時刻)に変換するコード

 カルチャ情報に依存した文字列表記は、単純に日時を画面に表示したい場合などには便利であるが、日時を文字列に変換してデータ項目の一つとして利用したいような場合(例えば、ファイル名として使用するために「20040824202306」という文字列を得たい場合)などには使えない。このような場合には、(3)のカスタム書式指定文字列による文字列変換を利用すると、その出力形式を自由に指定できる。

カスタム書式指定文字列による変換

 カスタム書式指定文字列では、書式指定子の組み合わせにより、独自の出力形式でDateTimeオブジェクトを文字列に変換できる。例えば次の例では、その結果が「20040824202306」などとなる。

DateTime.Now.ToString("yyyyMMddHHmmss")

現在の時刻を「西暦月日時分秒」の順に数字だけで構成される文字列に変換

 利用頻度が高いと思われる書式指定子を次にまとめた。

書式指定子 説明 出力例
yyyy 4けたの年 2004
yy 0埋め2けたの年 04
MM 0埋め2けたの月 08
dd 0埋め2けたの日 24
ddd 曜日の省略名(カルチャに依存)
dddd 曜日の完全名(カルチャに依存) 火曜日
HH 0埋め2けたの時間(24時間表記) 20
hh 0埋め2けたの時間(12時間表記) 08
mm 0埋め2けたの分 23
ss 0埋め2けたの秒 06
利用頻度が高いと思われる書式指定子

 ここでは固定幅で出力可能な書式指定子のみを挙げている(書式指定子の完全な一覧は、MSDNの「カスタム日時書式指定文字列」などを参照)。

 上表の中では、月が「MM」、分が「mm」と、どちらも同じ「エム」であることに注意が必要だ。

 なお、曜日に置き換わる「ddd」および「dddd」の二つはカルチャ情報に依存している。例えば「火曜日」は、英語環境では「Tue」および「Tuesday」となる。

カスタム書式指定文字列を使用したサンプルプログラム

 上記の書式指定子を使用してDateTimeオブジェクトを文字列に変換している簡単なサンプルプログラムを次に示す。

// customdate.cs

using System;

public class CustomDateTime {
  static void Main() {

    DateTime now = DateTime.Now;

    Console.WriteLine(now); // 出力例:2004/08/24 20:23:06

    Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"));
    Console.WriteLine(now.ToString("yyyyMMddHHmmss"));
    Console.WriteLine(now.ToString("yy年MM月dd日(ddd)"));
    Console.WriteLine(now.ToString("hh時mm分ss秒"));
    // 出力例:
    // 2004/08/24 20:23:06
    // 20040824202306
    // 04年08月24日(火)
    // 08時23分06秒

    Console.WriteLine("{0:yyyy/MM/dd HH:mm:ss}", now);
    Console.WriteLine("{0:yyyyMMddHHmmss}", now);
    Console.WriteLine(
      "{0:yy年MM月dd日(dddd)} {0:hh時mm分ss秒}", now);
    // 出力例:
    // 2004/08/24 20:23:06
    // 20040824202306
    // 04年08月24日(火曜日) 08時23分06秒
  }
}

// コンパイル方法:csc customdate.cs

カスタム書式指定文字列を使用したC#のサンプルプログラム(customdate.csファイル)
customdate.csファイルのダウンロードはこちらから。

' customdate.vb

Imports System

Public Class CustomDateTime
  Shared Sub Main()

    Dim now As DateTime = DateTime.Now

    Console.WriteLine(now) ' 出力例:2004/08/24 20:23:06

    Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss"))
    Console.WriteLine(now.ToString("yyyyMMddHHmmss"))
    Console.WriteLine(now.ToString("yy年MM月dd日(ddd)"))
    Console.WriteLine(now.ToString("hh時mm分ss秒"))
    ' 出力例:
    ' 2004/08/24 20:23:06
    ' 20040824202306
    ' 04年08月24日(火)
    ' 08時23分06秒

    Console.WriteLine("{0:yyyy/MM/dd HH:mm:ss}", now)
    Console.WriteLine("{0:yyyyMMddHHmmss}", now)
    Console.WriteLine( _
      "{0: yy年MM月dd日(dddd)} {0:hh時mm分ss秒}", now)
    ' 出力例:
    ' 2004/08/24 20:23:06
    ' 20040824202306
    ' 04年08月24日(火曜日) 08時23分06秒
  End Sub
End Class

' コンパイル方法:vbc customdate.vb

カスタム書式指定文字列を使用したVB.NETのサンプルプログラム(customdate.vbファイル)
customdate.vbファイルのダウンロードはこちらから。

 各サンプルプログラムの後半は、書式指定項目(インデックス付きのプレースホルダー)を使用した例である(書式指定項目についての詳細はMSDNの「複合書式指定」を参照)。

 なお、独自形式により出力された日時文字列をDateTimeオブジェクトに変換する方法については「.NET TIPS:日付や時刻の文字列をDateTimeオブジェクトに変換するには?」で示している。

C# 6.0/VB 14で追加された補間文字列機能を使用する

 C# 6.0/VB 14では「補間文字列」を使用することで、より簡潔な記述で、DateTime構造体を文字列に変換できる。

 補間文字列は先の例の後半で使用している複合書式指定における書式指定項目のインデックス(「{0}」「{1}」における「0」「1」など)の部分に直接、変数や式などを記述するものだと考えると分かりやすい。また、文字列の先頭には「$」記号を付加する。

$"字面通りに表示されるテキスト { 補間式, 文字列の幅:書式指定子} ……"

補間文字列
「字面通りに表示されるテキスト」「文字列の幅」「書式指定子」は省略可能。補間式に指定した要素が評価され、その結果が文字列に埋め込まれる。

 「,文字列の幅」には文字列の幅を、「:書式指定子」には上で見た標準書式指定文字列あるいはカスタム書式指定文字列を指定できる(「文字列の幅」「書式指定子」のいずれも省略可能)。

 例えば標準書式指定文字列の「F」(完全な日付と時刻のパターン。長い形式の時刻)を使用して、現在の時刻をコンソールに表示するには次のようにする。

var now = DateTime.Now;
Console.WriteLine($"{now:F}");

Dim now = DateTime.Now
Console.WriteLine($"{now:F}")

標準書式指定文字列を使用したサンプル(上:C#、下:VB)

 カスタム書式指定文字列を指定した場合の例は次のようになる。

var now = DateTime.Now;
Console.WriteLine($"{now:yyyyMMddHHmmss}");

Dim now = DateTime.Now
Console.WriteLine($"{now:yyyyMMddHHmmss}")

標準書式指定文字列を使用したサンプル(上:C#、下:VB)
これは「カスタム書式指定文字列による変換」の冒頭で見た書式指定子をそのまま使っている。

 よって、上のサンプルプログラムは次のように書き換えられる(なお、補間文字列を使用した場合、ToStringメソッドは不要になるので、上のサンプルプログラムと全く同じわけではないことに注意。書式指定文字列が異なるものだけをピックアップしてある)。

// interpolateddate.cs

using System;

public class CustomDateTime {
  static void Main() {

    DateTime now = DateTime.Now;

    Console.WriteLine(now); // 出力例:2004/08/24 20:23:06

    Console.WriteLine(now.ToString($"{now:yyyy/MM/dd HH:mm:ss}"));
    Console.WriteLine(now.ToString($"{now:yyyyMMddHHmmss}"));
    Console.WriteLine(now.ToString($"{now:yy年MM月dd日(ddd)}"));
    Console.WriteLine(now.ToString($"{now:hh時mm分ss秒}"));
    Console.WriteLine(
      $"{now:yy年MM月dd日(dddd)} {now:hh時mm分ss秒}");
    // 出力例:
    // 2004/08/24 20:23:06
    // 20040824202306
    // 04年08月24日(火)
    // 08時23分06秒
    // 04年08月24日(火曜日) 08時23分06秒
  }
}

// コンパイル方法:csc interpolateddate.cs

' interpolateddate.vb

Imports System

Public Class CustomDateTime 
  Shared Sub Main()

    Dim now As DateTime = DateTime.Now

    Console.WriteLine(now) ' 出力例:2004/08/24 20:23:06

    Console.WriteLine(now.ToString($"{now:yyyy/MM/dd HH:mm:ss}"))
    Console.WriteLine(now.ToString($"{now:yyyyMMddHHmmss}"))
    Console.WriteLine(now.ToString($"{now:yy年MM月dd日(ddd)}"))
    Console.WriteLine(now.ToString($"{now:hh時mm分ss秒}"))
    Console.WriteLine( _
      $"{now:yy年MM月dd日(dddd)} {now:hh時mm分ss秒}")
    ' 出力例:
    ' 2004/08/24 20:23:06
    ' 20040824202306
    ' 04年08月24日(火)
    ' 08時23分06秒
    ' 04年08月24日(火曜日) 08時23分06秒
  End Sub
End Class

' コンパイル方法:vbc interpolateddate.vb

補間文字列を使用して書き直したコード(上:C#/下:VB)
interpolateddate.csファイルのダウンロードはこちらから。
interpolateddate.vbファイルのダウンロードはこちらから。

 余談だが、上記のコードで変数nowに現在時刻を入れているが、補間文字列の補間式には次のように任意の式を記述してもよい(ただし、時間の扱いを厳密にするのであれば、上のサンプルコードのように一度変数に現在時刻を保存しておくべきである)。ここではコード例はC#のみとする。

Console.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss}");

補間式には任意の式を記述できる

カテゴリ:クラス・ライブラリ 処理対象:文字列
カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:DateTime構造体(System名前空間)
関連TIPS:日付や時刻の文字列をDateTimeオブジェクトに変換するには?


更新履歴更新履歴

【2015/11/24】C# 6.0/VB(Visual Basic) 14の補間文字列に対応した記述を追加しました。

【2004/09/02】関連TIPSとして「TIPS:日付や時刻の文字列をDateTimeオブジェクトに変換するには?」についての記述を追加しました。

【2004/08/27】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

編集部からのお知らせ

@IT編集部では、編集記者を募集しています。ご興味のある方は奮ってご応募ください。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。