1文字だけの書式指定子は標準の書式指定子として扱われる点に注意が必要です。 例えば、24時間制で0埋めなしの時間部分を表すカスタム書式指定子Hを単独で指定した場合、これは標準の書式指定子として扱われます。 一方、標準の書式指定子Hは存在しないため、例外FormatExceptionがスローされます。
カスタム書式指定子を1文字だけ指定する場合は、先頭に%を付けることによって、それがカスタム書式指定子であることを明示する必要があります。
書式指定文字列において、単独の文字がカスタム書式指定子として扱われるようにする
      using System;
class Sample {
  static void Main()
  {
    var dt = DateTime.Now;
    Console.WriteLine(dt.ToString());
    Console.WriteLine("%H : {0}", dt.ToString("%H")); // 時
    Console.WriteLine("%m : {0}", dt.ToString("%m")); // 分
    Console.WriteLine("%s : {0}", dt.ToString("%s")); // 秒
    Console.WriteLine("%d : {0}", dt.ToString("%d")); // 日
    Console.WriteLine("d  : {0}", dt.ToString("d"));  // 短い形式の日付 (標準の書式指定子)
    Console.WriteLine();
    var dto = DateTimeOffset.Now;
    Console.WriteLine(dto);
    Console.WriteLine("%H : {0}", dto.ToString("%H")); // 時
    Console.WriteLine("%m : {0}", dto.ToString("%m")); // 分
    Console.WriteLine("%s : {0}", dto.ToString("%s")); // 秒
    Console.WriteLine("%d : {0}", dto.ToString("%d")); // 日
    Console.WriteLine("d  : {0}", dto.ToString("d"));  // 短い形式の日付 (標準の書式指定子)
  }
}
       
      ja-JPでの実行結果例
      2013/04/01 15:00:30 %H : 15 %m : 0 %s : 30 %d : 1 d : 2013/04/01 2013/04/01 15:00:30 +09:00 %H : 15 %m : 0 %s : 30 %d : 1 d : 2013/04/01