none
時刻の書式について RRS feed

  • 質問

  • おはようございます。

    VB2010Express+SQLServer2008Expressを使用しています。

    DataGridViewのTextboxに時刻データをバインドしてあります。

    DefaultCellStyleのFormatにて「t」(サンプル表示では 13:00 と秒の表示が出ていません)を
    指定しております。

    しかし、データを読み込むと 13:00:00 と秒まで表示されてしまいます。

    いろいろと調べてはいるのですが、「13:00」というように、秒を表示しない方法がどうしても見つかりません。

    どうか、アドバイスをいただけないでしょうか。

    よろしくお願いします。

    2012年5月5日 22:04

回答

  • DBからは、Time型のフィールドのデータを取得しております。

    おそらく一旦データテーブルに落としていると思いますが、そこでの型は何になっていますか?以下の表によればTimeSpan型になっているのではないかと思います。

    SQL Server データ型のマッピング (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/cc716729.aspx

    詳しく見ていませんが、TimeSpan型はIFormattableインターフェースを継承していませんから、フォーマットできないのだと思います。
    解決策としては、CellFormattingイベントで書き換えるか、以下のように独自のFormatProviderを用意することになると思います。

    Format TimeSpan in DataGridView column
    http://stackoverflow.com/questions/3627922/format-timespan-in-datagridview-column


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク TI-cb400 2012年5月10日 4:20
    2012年5月6日 4:31
    モデレータ

すべての返信

  • 調べ方がおかしいです。

    Format プロパティ、このドキュメントを見つけることはできましたか? この中に型の書式設定というリンクがあり、標準の日付と時刻の書式指定文字列カスタムの日付と時刻の書式指定文字列がリンクされています。

    これらはString.Format()やConsole.WriteLine()と共通の基本的な書式設定方法ですので、まずこれを読んで理解してください。

    2012年5月5日 22:50
  • ご回答ありがとうございます。

    ご提示いただいたリンクはすべて読んでおります。

    DBからは、Time型のフィールドのデータを取得しております。

    そこで、
    DataGridView.columns(0).DefaultCellStyle.Format="HH:mm”
    と記述しております。

    すると、
    「入力文字列の形式が正しくありません」
    とのエラーが出ます。

    いったん、日付を含めた形式にする必要があるかとも思いましたが、それもおかしいと思い、
    もう一度、ヘルプを読み直しているところです。

    現状報告まで。

    2012年5月6日 0:46
  • DataGridView.columns(0).DefaultCellStyle.Format="HH:mm”

    mm がいわゆる全角文字になってますが実際のコードは大丈夫ですか?
    2012年5月6日 2:00
  • ご回答ありがとうございます。

    mmは半角としております。

    2012年5月6日 3:05
  • DBからは、Time型のフィールドのデータを取得しております。

    おそらく一旦データテーブルに落としていると思いますが、そこでの型は何になっていますか?以下の表によればTimeSpan型になっているのではないかと思います。

    SQL Server データ型のマッピング (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/cc716729.aspx

    詳しく見ていませんが、TimeSpan型はIFormattableインターフェースを継承していませんから、フォーマットできないのだと思います。
    解決策としては、CellFormattingイベントで書き換えるか、以下のように独自のFormatProviderを用意することになると思います。

    Format TimeSpan in DataGridView column
    http://stackoverflow.com/questions/3627922/format-timespan-in-datagridview-column


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク TI-cb400 2012年5月10日 4:20
    2012年5月6日 4:31
    モデレータ
  • SQL ServerのTIME型は、ADO.NETにおいてTimeSpanとして扱われるはずです(SqlDataReaderだとGetDateTimeで取得することになるので暗黙にDateTimeに変換されるかと思いますが)。デバッガ等で該当列の型を確認してください。

    SQL Server データ型のマッピング (ADO.NET)

    TimeSpanであるなら、DateTimeとはまた別の書式指定文字列を使用します。先ほど挙がった書式指定のページから、時間間隔書式指定文字列のページを参照してください。

    ただし、TimeSpanに書式指定文字列を適用できるようになったのは.NET Framework 4からですので、それ以前のフレームワークをターゲットにしているなら、DBから読み取る際にDateTimeに変換するなどの処理が必要になります。また、時間間隔書式指定文字列は正直使いづらいので、.NET 4がターゲットであってもDateTimeに変換しちゃうのもアリだと思います。

    2012年5月6日 4:32
  • ご回答ありがとうございます。

    いろいろとテストをした結果、DateTime型でデータを持ったほうが便利であることがわかりました。

    ほかの事例でもあったのですが、SQLServerとADO.NETでデータ型に違いがあり、エラーが
    発生し悩んだことがあったのですが、今回も同じようなことなのですね。

    ご提示いただいたリンクなどを参考に、もっと勉強をしたいと思います。

    ご回答ありがとうございました。

    2012年5月6日 8:52
  • 質問文には「時刻」としかなかったのでDateTime型の紹介をしました。SQL ServerのTime型でVB側でTimeSpan型でしたら、先に紹介した型の書式設定の中に標準の時間間隔書式指定文字列カスタム時間間隔書式指定文字列があります。

    DateTime型でもTimeSpan型でも構いませんが、データ型をきちんと意識しましょう。

    2012年5月6日 21:55
  • ご回答ありがとうございます。

    最近、SQLServer2008 Expressを導入したばかりで、DateTime型でもTimeSpan型の違いがあることすら
    気が付いていませんでした。

    今後は、質問の仕方も勉強したいと思います。

    ありがとうございました。

    2012年5月10日 3:24