時間表示を変換するには?

解決


きんぴら  2009-01-18 22:09:41  No: 145677

お世話になります。

エクセルファイルをOLEDBコネクションで接続し、DataGridViewに表示したのですが、
時間表示の 0:13.12 部分が 1899/12/30 0:00 となってしまいます。
0:13.12 として表示できるよう良い方法がありましたらお教えください。

VB2005, WinXPsp3 です。よろしくお願いします。


魔界の仮面弁士  2009-01-19 20:20:55  No: 145678

> 0:13.12 として表示できるよう良い方法がありましたらお教えください。

DataGridView に表示する際に、日付書式を設定していますか?

日付を文字列として表わす場合は、自動変換にまかせるのではなく、
必ず書式を割り当てるようにしてください。たとえば今回の場合、
  DataGridView1.Columns(0).DefaultCellStyle.Format = "mm:ss.ff"
などと書く事ができます。

> 時間表示の 0:13.12 部分が 1899/12/30 0:00 となってしまいます。

その 00.13.12 は、内部で倍精度浮動小数点型として管理されており、
数値としてみてみると、約 1.51851851851852E-04 という値になります。

それゆえ、OLEDB などを介して「OLE の日付型」としてみた場合には、
下記のような変換が発生することになります。

  Dim rawValue As Double = 1.51851851851852E-04#
  Dim oleDate As Date = Date.FromOADate(rawValue)

  '1899/12/30 0:00:13
  TextBox1.Text = oleDate.ToString("g")

  '00:13.12
  TextBox2.Text = oleDate.ToString("mm:ss.ff")

  '1899/12/30 00:00:13.1200000
  TextBox3.Text = oleDate.ToString("yyyy/MM/dd HH:mm:ss.fffffff")

-----

<OLE の日付型>
「8 バイトの浮動小数点数」として管理されている(そのため、誤差が含まれる事に注意!)。
内部値の整数部は、「1899/12/30 からの経過日数」を示す値になっている。
絶対値の小数部は時刻部を表し、正午であれば0.5、午前3時ならば0.25となる。
最大日付は「9999/12/31 23:59:59」、最小日付は「0100/01/01 00:00:00」。

<.NET の日付型>
「8バイトの整数型」として管理されている(そのため、格納誤差が発生しない)。
内部値は、「0001/01/01 00:00:00.0000000」からの経過時間を表しており、
内部値が 1 増えるごとに、そこから 100ナノ秒進んだ日時を表す。
最大日付は「9999/12/31 23:59:59.9999999」、最小日付は「0001/01/01 00:00:00.0000000」。


きんぴら  2009-01-23 18:37:59  No: 145679

魔界の仮面弁士さんありがとうございます。
DataGridView1.Columns(0).DefaultCellStyle.Format = "mm:ss.ff"
この方法で無事表示することはできました。
いろいろ挑戦する中でお聞きしたいことがでてきましたが、
とりあえずこの質問については解決とします。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加