標準の書式の他にも、独自に書式を定義して文字列化することもできます。 例えば、年月だけ出力したい、西暦の桁数を指定したい、時刻を12時間制にしたい、ミリ秒部分の精度を指定して文字列化したい、といったように、標準の書式では定義されていない書式で文字列化したい場合にはカスタム書式指定子を使用することができます。

次の例では、いくつかのカスタム書式指定子を使ってDateTime・DateTimeOffsetを文字列化しています。

カスタム書式指定子を使ってDateTime/DateTimeOffsetを文字列に変換する
using System;

class Sample {
  static void Main()
  {
    DateTime dt = DateTime.Now;

    Console.WriteLine(dt.ToString());
    Console.WriteLine("M/d/yy            : {0}", dt.ToString("M/d/yy"));          // 月/日/年2桁
    Console.WriteLine("yyyy/MM/dd        : {0}", dt.ToString("yyyy/MM/dd"));      // 年4桁/月(0埋めあり)/日(0埋めあり)
    Console.WriteLine("M月d日 dddd       : {0}", dt.ToString("M月d日 dddd"));     // x月y日 曜日
    Console.WriteLine("tt hh時mm分ss秒   : {0}", dt.ToString("tt hh時mm分ss秒"));  // [午前|午後] x時y分z秒 (0埋めあり、12時間制)
    Console.WriteLine("H:m:s.ff          : {0}", dt.ToString("H:m:s.ff"));        // 時:分:秒.秒の端数 (0埋めなし、24時間制、1/10秒単位で表示)
    Console.WriteLine();

    DateTimeOffset dto = DateTimeOffset.Now;

    Console.WriteLine(dto.ToString());
    Console.WriteLine("tt hh時mm分ss秒   : {0}", dto.ToString("tt hh時mm分ss秒"));  // [午前|午後] x時y分z秒 (0埋めあり、12時間制)
    Console.WriteLine("H:m:s.ff          : {0}", dto.ToString("H:m:s.ff"));        // 時:分:秒.秒の端数 (0埋めなし、24時間制、1/10秒単位で表示)
    Console.WriteLine("HH:mm:ss (zzz)    : {0}", dto.ToString("HH:mm:ss (zzz)"));  // 時:分:秒 (オフセット値) (0埋めあり、24時間制)
    Console.WriteLine();
  }
}
ja-JPでの実行結果例
2013/04/01 15:00:30
M/d/yy            : 4/1/13
yyyy/MM/dd        : 2013/04/01
M月d日 dddd       : 4月1日 月曜日
tt hh時mm分ss秒   : 午後 03時00分30秒
H:m:s.ff          : 15:0:30.12

2013/04/01 15:00:30 +09:00
tt hh時mm分ss秒   : 午後 03時00分30秒
H:m:s.ff          : 15:0:30.12
HH:mm:ss (zzz)    : 15:00:30 (+09:00)

上記の実行結果からも分かるように、カスタム書式指定子にもローカライズされるものとそうでないものが存在するため、実行環境に設定されているカルチャ(ロケール)によっては結果が異なる個所があります。 日付・時刻の区切り記号もエスケープしない限りローカライズの対象となる点に注意が必要です。 上記以外のカスタム書式指定子やその詳細についてはカスタムの日付と時刻の書式指定文字列にまとめられています。