お世話になります。
エクセルファイルをOLEDBコネクションで接続し、DataGridViewに表示したのですが、
時間表示の 0:13.12 部分が 1899/12/30 0:00 となってしまいます。
0:13.12 として表示できるよう良い方法がありましたらお教えください。
VB2005, WinXPsp3 です。よろしくお願いします。
> 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」。
魔界の仮面弁士さんありがとうございます。
DataGridView1.Columns(0).DefaultCellStyle.Format = "mm:ss.ff"
この方法で無事表示することはできました。
いろいろ挑戦する中でお聞きしたいことがでてきましたが、
とりあえずこの質問については解決とします。
ありがとうございました。