VB2005Expressで、2つの変数に格納されたString型の時間表示(例 = 00:15:00と00:02:00)をDate型(フォーマット = mm:ss:ff)に変換し、その計算をしたいのですが、うまくいきません。


例えば仮に

Dim timeStr As String = ”00:15:00”
Dim timeMinus As String = ”00:02:00”

としたうえで、String型からDate型(フォーマット = mm:ss:ff)へ変換を行い、「timeStr - timeMinus」で「00:13:00」という値をDate・String両方で出力したいのです。

まとめとしてはこんな感じで。
例)”00:15:00”(String型) - ”00:02:00”(String型) = ”00:13:00”(Date/String型)

MSDNも見たんですが難しくて初心者には全然理解不能で、粘ってみたんですがどうしても探しきれませんでした。どうか知恵をお貸しください。よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:EddyYamanaka No.1

回答回数385ベストアンサー獲得回数1

ポイント34pt

URLはダミーです。

欲しいのが秒単位だとすると、引きたい時間数を秒数にして、元の時間からその秒数を引けばいいと思います。

===================================

Dim timeStr As String = ”00:15:00”

Dim timeMinus As String = ”00:02:00”


Dim dtV1 As Date ’元の時間

Dim dtV2 As Date ’引きたい時間

Dim lDiff As Long ’引きたい秒数


Dim dtAns As Date ’求める日時

Dim stAns As String ’求める文字列


dtV1 = timeStr

dtV2 = timeMinus


lDiff = DateDiff(DateInterval.Second, #00:00:00#, dtV2)

dtAns = DateAdd(DateInterval.Second, 0 - lDiff, dtV1)


stAns = dtAns

===================================

id:kreuz2nd

回答ありがとうございます。早速MSDNを開きつつ勉強させていただきました。

VB2005Expressだと

    lDiff = DateDiff(DateInterval.Second, #00:00:00#, dtV2)

が、自動的に

    lDiff = DateDiff(DateInterval.Second, #12:00:00 AM#, dtV2)

に変換されてしまうみたいですが、確かに引き算されているみたいです。

タイムフォーマットがhh:mm:ssのままというのが残念ですが、まぁ最悪表示さえ出来ればいいので、これでも問題なしです。ありがとうございました。

2006/01/27 14:38:13
id:bonlife No.2

回答回数421ベストアンサー獲得回数75

ポイント33pt

http://www.atmarkit.co.jp/fdotnet/dotnettips/267timespan/timespa...

@IT:.NET TIPS 日時や時間間隔の加減算を行うには? - C# VB.NET

TimeSpan構造体というのがあるようです。

便利に使えそうですね。


Dim timeStr As String = ”00:15:00”

Dim timeMinus As String = ”00:02:00”

’ フォーマット用文字列

Dim f As String = ”hh:mm:ss”

’ DateTime型に変換

Dim a As DateTime = DateTime.ParseExact(timeStr, f, Nothing)

Dim b As DateTime = DateTime.ParseExact(timeMinus, f, Nothing)

’ TimeSpan構造体として2つのDateTimeの差異を取得

Dim timeCompareResult As TimeSpan = a.Subtract(b)

’ timeStrの値がtimeMinusより小さい場合のみ処理

If (timeCompareResult.TotalSeconds >= 0) Then

’ 例としてMsgBoxで表示

MsgBox(Format(timeCompareResult.Hours, ”0#”) & ”:” & Format(timeCompareResult.Minutes, ”0#”) & ”:” & Format(timeCompareResult.Seconds, ”0#”))

’ 以下のように分けても良いかもしれないですね

’ Dim hours As Integer = timeCompareResult.Hours

’ Dim minutes As Integer = timeCompareResult.Minutes

’ Dim seconds As Integer = timeCompareResult.Seconds

’ MsgBox(Format(hours, ”0#”) & ”:” & Format(minutes, ”0#”) & ”:” & Format(seconds, ”0#”))

Else

MsgBox(”timeStrの値がtimeMinusより大きいですよ。”)

End If


マイナスになる場合、このやり方だと時、分、秒それぞれの差異が出力されるので、


01:-02:03


のような出力になってしまいます。

(上記のサンプルではIf文ではじいていますので、実際には出力されません。)

http://www.hatena.ne.jp/1138308234#

人力検索はてな - VB2005Expressで、2つの変数に格納されたString型の時間表示(例 = 00:15:00と00:02:00)をDate型(フォーマット = mm:ss:ff)に変換し、その計算をしたいのですが、うま..

URLはダミーです。

古いやり方だったら以下のような感じになると思います。

こちらはDateDiffで2つの時刻の差異を秒で取得し、出力用に整形しています。


Dim timeStr As String = ”00:15:00”

Dim timeMinus As String = ”00:03:00”

Dim timeCompareResult As Double = DateDiff(DateInterval.Second, Date.Parse(timeMinus), Date.Parse(timeStr))

If timeCompareResult >= 0 Then

Dim Hours As Integer = timeCompareResult / 3600

Dim Minutes As Integer = timeCompareResult / 60 - Hours * 60

Dim Seconds As Integer = timeCompareResult - Hours * 3600 - Minutes * 60

MsgBox(Format(Hours, ”0#”) & ”:” & Format(Minutes, ”0#”) & ”:” & Format(Seconds, ”0#”))

Else

MsgBox(”timeStrよりもtimeMinusの方が値が大きいですよ。”)

End If

id:kreuz2nd

回答ありがとうございます。TimeSpanですかー。まだ私には理解がいまひとつ出来てないのですが、無事出力できました(いや、当たり前でしょうけど)。

勉強がてら、失礼ながらいろいろいじらせてもらいましたが、mm:ss:ffにできるみたいですね。DateTimeってこういう意味だったのか!と思いました。とりあえずまだわからないところはあるのでMSDNで調べつつ勉強していきたいと思います。

ありがとうございました。一応解決したのですが、その他に便利な回答があるかわからないので、もう少し質問を続けておきたいと思います。上記以外のお答え以外であればよろしくおねがいします。

2006/01/27 15:31:09
id:bonlife No.3

回答回数421ベストアンサー獲得回数75

ポイント33pt

http://www.atmarkit.co.jp/fdotnet/dotnettips/203dateparse/datepa...

@IT:.NET TIPS 日付や時刻の文字列をDateTimeオブジェクトに変換するには? - C# VB.NET

質問読み違えてました。

hh:mm:ssでの説明になっていたのでmm:ss:ffに修正いたしました。


Dim timeStr As String = ”00:15:00”

Dim timeMinus As String = ”00:02:00”

’ フォーマット用文字列

Dim f As String = ”mm:ss:ff”

’ DateTime型に変換

Dim a As DateTime = DateTime.ParseExact(timeStr, f, Nothing)

Dim b As DateTime = DateTime.ParseExact(timeMinus, f, Nothing)

’ TimeSpan構造体として2つのDateTimeの差異を取得

Dim timeCompareResult As TimeSpan = a.Subtract(b)

’ timeStrの値がtimeMinusより小さい場合のみ処理

If (timeCompareResult.TotalMilliseconds >= 0) Then

’ 例としてMsgBoxで表示

’ ffの部分はミリ秒の値を10で割って算出

MsgBox(Format(timeCompareResult.Minutes, ”0#”) & ”:” & Format(timeCompareResult.Seconds, ”0#”) & ”:” & Format(timeCompareResult.Milliseconds / 10, ”0#”))

Else

MsgBox(”timeStrの値がtimeMinusより大きいですよ。”)

End If

id:kreuz2nd

あ、今まさに、コメント書いた直後でした。(笑

私がいじったのとほぼ同じでしたが、ミリセカンドの部分を10で割るのは思いつきませんでした。というか今まさに調べてました。わざわざありがとうございます。

2006/01/27 15:33:30

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません