スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
目次
簡単な具体例
TimeSpan型を文字に変換する際に、書式を指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TimeSpan05 { class Program { static void Main(string[] args) { TimeSpan tp = new TimeSpan(1, 9, 45); Console.WriteLine(tp.ToString("hh':'mm':'ss")); } } } |
実行結果
01:09:45
ToStringメソッドで書式指定を行って、文字列型として表示しています。
注意点
DateTime型とTimeSpan型の書式指定子の違い
DateTime型で使われる日時の書式指定子と、TimeSpan型で使われる時間間隔の書式指定子は似通っています。
例えば、秒を指定する指定子はともにss(s)を使用します。
しかし、異なる部分もあります。
最も大きな違いは、書式指定子として用意されていない文字に対する挙動です。
書式指定子として用意されていない文字に対して、DateTime型は、単なる文字として解釈しようとします。
それに対し、TimeSpan型は、書式指定子として解釈しようとします。
それに加えて、TimeSpan型では、「:」と「/」は書式指定子として使えません。
そのため、DateTime型ではなじみのある以下のような書き方はエラーを起こします。
.ToString(“hh:mm:ss”)
「:」「/」が文字であることを示すために、’’(シングルクォーテーション)で囲む必要があります。
つまり、以下のように書く必要があります。
.ToString(“hh’:’mm’:’ss”)
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TimeSpan06 { class Program { static void Main(string[] args) { TimeSpan tp = new TimeSpan(1, 9, 45); DateTime dt = System.DateTime.Now; //エラー //Console.WriteLine(tp.ToString("テスト:hh")); Console.WriteLine(dt.ToString("テスト:hh")); //エラー //Console.WriteLine(tp.ToString("hh:mm:ss")); Console.WriteLine(dt.ToString("hh:mm:ss")); //下の書き方は両方とも通る Console.WriteLine(tp.ToString("hh':'mm':'ss")); Console.WriteLine(dt.ToString("hh':'mm':'ss")); } } } |
実行結果
テスト:03
03:43:51
01:09:45
03:43:51
1文字だけしか指定しない場合は注意
時間間隔の書式指定文字列には、「カスタム時間間隔書式指定文字列」と「標準の時間間隔書式指定文字列」の2種類があります。
もしも、時間間隔の書式指定文字列が1文字であった場合、「カスタム時間間隔書式指定文字列」ではなく、「標準の時間間隔書式指定文字列」として解釈されます。
そのため、「カスタム時間間隔書式指定文字列」のつもりで1文字だけ書式指定を行うと、予期せぬ結果や、エラーが起きます。
カスタム書式指定子を1つしか使わない場合は先頭に%を付けることで回避できます。
※この問題はTimeSpan型(時間間隔)だけでなく、DateTime型(日時)でも共通です。
カスタム時間間隔書式指定文字列
カスタム時間間隔書式指定文字列は以下のような書式指定子の組み合わせから成ります。
書式指定子 | 意味 |
d(dd~dddddddd) | 日 |
hh(h) | 時 |
mm(m) | 分 |
ss(s) | 秒 |
f(F) | 秒以下を指定(fの数に応じて7桁まで指定可) |
% | カスタム書式指定子として認識する |
” | 書式指定子でなく、単なる文字として認識 |
\ | 書式指定子でなく、単なる文字として認識 |
指定子の長さによって、結果は変わります。
例えば、「ss」(01~59)と「s」(1~59)は秒を指定するために使われます。
しかし、微妙に表示のされ方が変わることがあります。
5秒を表示するとき、「ss」であれば、「05」とゼロが付き、「s」であれば、「5」とゼロが省かれます。
また、上でも説明した通り、カスタム書式指定子を一文字で使用する場合は、前に「%」をつける必要があります。
なぜなら、1文字の場合、「カスタム時間間隔書式指定文字列」でなく、「標準の時間間隔書式指定文字列」として解釈されるからです。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TimeSpan07 { class Program { static void Main(string[] args) { TimeSpan tp = new TimeSpan(1, 9, 45, 30, 200); Console.WriteLine(tp.ToString("hh':'mm':'ss")); //ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。 //カスタム書式指定子は1文字単体では使えないので、以下の文はエラー //Console.WriteLine(tp.ToString("d")); Console.WriteLine(tp.ToString("%d")); Console.WriteLine(tp.ToString("dd")); Console.WriteLine(tp.ToString("ddd")); Console.WriteLine(tp.ToString("dddd")); Console.WriteLine(tp.ToString("dddddddd")); Console.WriteLine(tp.ToString("%h")); Console.WriteLine(tp.ToString("hh")); Console.WriteLine(tp.ToString("%m")); Console.WriteLine(tp.ToString("mm")); Console.WriteLine(tp.ToString("%s")); Console.WriteLine(tp.ToString("ss")); Console.WriteLine(tp.ToString("%f")); Console.WriteLine(tp.ToString("ff")); Console.WriteLine(tp.ToString("fffffff")); Console.WriteLine(tp.ToString("%F")); Console.WriteLine(tp.ToString("FF")); Console.WriteLine(tp.ToString("FFFFFFF")); //ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。 //Console.WriteLine(tp.ToString("hh:mm:ss")); Console.WriteLine(tp.ToString("hh':'mm':'ss")); //\は2つで「\」と認識する(エスケープシーケンス) Console.WriteLine(tp.ToString("hh\\:mm\\:ss")); //@を付けて、逐語的リテラル文字列として扱えば\は1つで済む Console.WriteLine(tp.ToString(@"hh\:mm\:ss")); } } } |
実行結果
09:45:30
1
01
001
0001
00000001
9
09
45
45
30
30
2
20
2000000
2
2
2
09:45:30
09:45:30
09:45:30
標準の時間間隔書式指定文字列
標準の時間間隔書式指定文字列は以下の書式指定子を使って指定します。
書式指定子 | 意味 | 対応するカスタム書式指定子 |
c | 日.時:分:秒.ミリ秒 | d’.’hh’:’mm’:’ss’.’fffffff |
g | 日.時:分:秒.ミリ秒 | d’.’h’:’mm’:’ss’.’FFFFFFF |
G | 日.時:分:秒.ミリ秒 | d’.’hh’:’mm’:’ss’.’fffffff |
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TimeSpan08 { class Program { static void Main(string[] args) { TimeSpan tp = new TimeSpan(1, 9, 45, 30, 200); Console.WriteLine(tp.ToString("c")); Console.WriteLine(tp.ToString("d'.'hh':'mm':'ss'.'fffffff")); Console.WriteLine(tp.ToString("g")); Console.WriteLine(tp.ToString("d'.'h':'mm':'ss'.'FFFFFFF")); Console.WriteLine(tp.ToString("G")); Console.WriteLine(tp.ToString("d'.'hh':'mm':'ss'.'fffffff")); } } } |
実行結果
1.09:45:30.2000000
1.09:45:30.2000000
1:9:45:30.2
1.9:45:30.2
1:09:45:30.2000000
1.09:45:30.2000000
関連記事
~プログラミングを勉強してみませんか?~
TechAcademy [テックアカデミー] は無料の体験講座が用意されているので、気軽に体験できます。
※私(サイト主)も無料体験講座を実際に受けてみました(→感想)