質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

5233閲覧

開始時間~終了時間で日付を跨ぐデータの扱いと変換について

xxx8

総合スコア41

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/08/21 10:41

編集2018/08/21 11:23

前提・実現したいこと

開始時間と終了時間の値によって分岐処理を行いたいです。
なお、元となるデータは「HH:MM AM」、「HH:MM PM」などの形式です。

以下詳細です。
・日付を跨ぐ勤務データの場合はAM12:00を24:00としたい。
・日付を跨がない勤務データの場合はAM12:00を00:00としたい。
・日付は変更しない。

     例1 日付を跨ぐ場合)
開始時間 PM08:00 終了時間 AM03:00 の場合
開始時間 2000 終了時間2700

     例2 日付を跨がない場合)
開始時間 AM12:00 終了時間 AM08:00 の場合
開始時間 0000 終了時間0800

試していること

1.午前なのか午後なのかを取得

vb.net

1strStart = Microsoft.VisualBasic.Right(開始時間, 2) 2strEnd = Microsoft.VisualBasic.Right(終了時間, 2)

2.開始時間と終了時間が午前と午後で違う場合
かつ開始時間が"PM"なら

vb.net

1If Not strStart = strEnd And strStart = "PM" then 2

正直どうロジックを組めばいいかさっぱり分かりません。

開始時間が"AM"で終了時間が"PM"の場合は普通に考えて
日を跨いでいないと思っています。

なので開始時間が"PM"の場合の分岐にて
終了時間が"AM"ならば24:00を超えるデータに変換すればよいと思っています。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015
VB.NET
.Framework 4.6

追記

他システムで作成された勤務データが
CSV形式のファイルで保存されています。

そのCSV形式のファイルの開始時間と終了時間のフィールドは
「HH:MM AM」、「HH:MM PM」の書式になっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

  1. 元となる時刻を両方ともそのまま24時間表記にする

これはできますよね?00:00 AMは終了時刻だろうが開始時刻だろうかそのまま00:00とすればいいです。その上で、

  1. 終了時間のほうが開始時間よりの小さい場合、終了時間に24時間加える

例えば開始が09:00で終了が00:00なら、終了時刻に24時間分加算して24:00とする。終了が01:00なら25:00になりますね。

  1. 勤務時間 = 終了時間 - 開始時間

とすれば、分岐は2.の1回で済みます。

.NETにはこのような時間差の計算が簡単にできるTimeSpanというクラスというか構造体があります。参考にしてください。

投稿2018/08/21 12:32

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxx8

2018/08/23 04:53

大変参考になりました。ありがとうございます。
guest

0

24時間以上の経過がないのであれば

VB

1If 開始時間 > 終了時間 Then 2 '日跨り 3End If

でいいのではないでしょうか?

また、データをどのように保持されるのか分かりませんが、
入力時に入力するのが時間だけだったとしても、日付まで付加した方が、いろいろ楽になるのではないかと思います。

投稿2018/08/21 11:15

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxx8

2018/08/21 11:24

追記を記載いたしました。 既にあるデータに対しての処理なので 「入力時」という処理がありません・・・・・・・
YAmaGNZ

2018/08/21 11:33

入力時というのは、キーボード等のUIからの入力だけではなく、データの入力という意味合いのつもりでした。言葉足らずで申し訳ありません。 ただ、どのみち日跨りの判断はしなくてはならないので、入力時の時に一回やってしまって、プログラム内部では日付も含めたデータとして扱った方がいいと考えました。
guest

0

YAmaGNZさんのおっしゃるように、文字列のままではなく、日付など何らかのデータに変換した方が扱いやすいと思われます。

VS起動するのが面倒だったのでPowerShellでの走り書きですが、以下のような雰囲気でしょうか。
PowerShell固有の機能は使っていないので適当にVBに読み替えてください。

このまま実行するならWindows PowerShell ISEに貼り付けて「実行」で。

powershell

1# 入力文字列 2[string]$inputStartTime = '08:00 PM' 3[string]$inputEndTime = '03:00 AM' 4 5# System.DateTimeのクラスメソッドでDateTimeに変換 6# 文字列の形式によってはParseExactの方が良いかも 7[datetime]$startDate = [datetime]::Parse($inputStartTime) 8[datetime]$endDate = [datetime]::Parse($inputEndTime) 9 10# 純粋な時間を取得(上記のDateTimeへの変換だと日付情報が無く実行タイミングによっては怖いため) 11[timespan]$startSpan = $startDate.TimeOfDay 12[timespan]$endSpan = $endDate.TimeOfDay 13 14# -ge = Greater Equal = >= 15if ($startSpan -ge $endSpan) { 16 # 開始時間が終了時間よりも大きい→日付またぎ 17 # 一日分追加 18 $endSpan = $endSpan.Add( [timespan]::FromDays(1) ) 19} 20 21# 結果コンソール出力 22[string]::Format('{0:00}{1:00}', $startSpan.Hours, $startSpan.Minutes ) 23[string]::Format('{0:00}{1:00}', [math]::Floor($endSpan.TotalHours), $endSpan.Minutes )

投稿2018/08/21 12:33

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問