• 締切済み

VC++で時間の計算をしたいのですが・・・

DataGridViewに表示した時間1から時間2までの経過時間を計算したいのですが、どのようにすればいいかわかりません。 データはcsvファイルから読み取り、DataGridViewに表示。 ユーザが入力し、上書き保存する、という流れを繰り返します。 項目は1行に9個あり、array<String^>^ Column[8]と配列を準備しています。 5列目が時間1(inTime)、6列目が時間2(outTime)となっています。 入力の形としては、inTimeに8:30、outTimeに20:20と入力し、その経過時間を9列目sumTimeに入れます。 経過時間は分単位、第1小数点まで求めたいです。 計算が必要なので、int型で宣言しています。最大で24時間以上の差がでることはありません。 日付は1列目に"9/20"とまとめてString型で入っています。 データの入出力はできたのですが、計算となると型の変換が必要となり、自分ではできませんでした。 開発環境はVC++2010.NET です。 プログラミングの経験もなく、VCもまだ始めたばかりの初心者です。 しかし、課題なので言語などは変更できません。 私だけでは解決できないので、よろしければアドバイスややり方を教えてください。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

.NET FrameworkのDateTimeとTimeSpanを使えばいいと思いますよ DateTime% d1 = DateTime::ToDay; DateTime% d2 = DateTime::ToDay; TimeSpan sp; long ldata; DateTime::TryParse( dt->Rows[n][L"in"], d1 ); DateTime::TryParse( dt->Rows[n][L"out"], d2 ); sp = d2 - d1; // 分単位を取得 ldata = (long)sp->TotalMinutes; // 6分の正規化 ldata /= 6; ldata *= 6; dt->Rows[n][L"sum"] = (double)ldata/60.; といった具合で

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

アルゴリズム(というか手順)の問題かと。 その前に… >入力の形としては、inTimeに8:30、outTimeに20:20と入力し、その経過時間を9列目sumTimeに入れます。 8時30分と20時20分…ですか? 8分30秒と20分20秒ですか? 前者なら秒の情報が無いので… >経過時間は分単位、第1小数点まで求めたいです。 で小数点未満が出ることはありませんが。 それとも、CSVには秒単位にデータが入っていて、表示するときに秒の切り捨て(あるいは繰り上げ)でもしているのでしょうか? とりあえず、数値に変換する際に「分単位」に揃えます。 # CSVが秒単位なら秒単位に揃える。 20*60+20と8*60+30という具合に。 でoutTimeからinTimeを引けば経過時間になります。 # 負数になったら24時間分を加算…ですかね。 分単位に揃える。とかしなくても時間を扱うクラスなどでさっくり処理できる場合もありますが。 # MFCならCTimeとCTimeSpanとか。

cocoa0529
質問者

お礼

回答ありがとうございます。 入力は8時30分と20時20分という意味です。 説明にまちがいがありました。 単位は最終的に時間に直さなければなりませんでした。 小数点が出るのは、6分ごとに0.1を足す計算となっているからです。 60分、つまり1時間たったときに1という計算です。 もし経過時間が8時30分から20時20分の場合、11時間と50分となります。 なので、11*60+50(分)/60=11.8時間(小数第2切り捨て)としたいのです。 .NET FreamWorkなので、MFCのクラスは使えないみたいでした。 入力の際に時間と分の間にコロンが入ってしまいます。(20:40のように) 計算するときには、左から2文字などのように指定ができるのでしょうか。

関連するQ&A

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • EXCEL2000でこんな時間の計算はできますか?

    EXCEL2000で下記のようなデータが入っています。 A列(時刻)B列(標準) 13:00   50 14:00   60 23:30   40 A列とB列を足してC列に時間を表示したいと考えています。 ※上記の例では、 13:50 15:00 0:10 とC列に表示されるようにしたい。 このような計算が可能かどうか? もし無理ならばどのように元データを入力すべきか、アドバイスをお願いいたします。

  • 時間計算できず困っています。

    WIN7, EXCEL2007で時間計算しようと思います。 E列に開始時間9:20 K列に終了時間11:40と入力しました。 Q列には関数 =+K63-E63+(E8<K63) が入っていますので 表示は2:20と表示されています。 Q列の最終行に =SUM(Q61:V91)の関数が入っており表示は10:20となっており 1行ずつ確かめたところ、間違いなく10時間20分でした。 この10時間20分を別のセルで 10.333に直し、たとえば単価1000円なら10333円というところです。 ところが、Q61:V91を範囲選択し下のコマンド欄を見ると 平均4:58:43 データの個数31 合計154:20:00となっているのです。 そのため154.333時間として計算されてしまいます。一体この数字はどこからでてきたのでしょうか。 表示どおり10時間20分で計算するにはどうしたらよろしいでしょうか。

  • Excelの時間の計算

    時間の計算の算出方法について質問です。 セルE16に 2015/11/25  17:59 という日付けと時間が入力されています。 セルH16に同じような形式で日付けと時間が入力された場合 セルK16に経過時間を表示する方法を教えて下さい。 ちなみにK16の経過時間は30分以上いくことは絶対にないので 分表示のみで大丈夫です(○○min と表示したい) またE16、H16ともに、マクロにて、セルの所でダブルクリックすると日付けと時間が 入るようになっています。 理想としてはH16の所でダブルクリックしたときにH16に日付けと時間が入力され K16に経過時間を表示という形にしたいです。 このような計算をした箇所が20行あります。 列は変わりません。 16から35行まで。 ご指導の程、宜しくお願いします。

  • EXCELで経過時間計算および作図

    実験データをEXCELで計算させ、結果を作図する場合なのですが、 (1)経過時間計算:入力として測定した時間をセルの書式指定で「日付、2006/6/2 16:20」と言った形式を指定したセルに入力し、経過時間を引き算し、その結果をセルの書式指定「時刻 13:30」とすると、経過時間が24時間以内であれば良いのですが、それ以上の時間では24進法で区切られてしまいます。25:00とか100:00時間と言った経過時間を表示させるのはどうしたらよいでしょうか? (2)作図:経過時間を横軸にして、結果を縦軸として作図したところ、横軸がやっぱり24進法で区切られます。これも25:00とか100:00時間と言った経過時間を表示させるのはどうしたらよいでしょうか?

  • 時間の計算が分かりません

    シフトなどでの時間の計算が出来ません。 たとえば A列に氏名 B列に開始時間 C列に終了時間 D列以降に9時から18時までの各時間が入力されていて 開始時間に9:00、終了時間に15:00と入力した場合D列以降の9時から15時までのセルに◆と入力されるようにするにはどうすればいいでしょうか? できればIFとANDを使った計算式にしたいのですがどうしてもエラーになってしまいます。 教えてください!!

  • EXCELでの時間計算について

    私の会社には、1ヶ月の残業時間を入力し印刷して提出する為のEXCELデータがあります。 自分で日毎に残業時間を入力して、その合計を電卓で計算して入力するようなものです。 残業した日が多い時は、いちいち合計を計算するのが面倒なので、なにか良い計算式は無いでしょうか。 今入力している方法は、A列に時間、B列に分(10分単位の入力)という感じで1ヶ月分を入力しています。 A列の「時間」は単純に足していけばよいのでしょうが、B列は「分」なので例えば合計して510分となったとき、 それを8時間30分にして、その8時間をA列のほうに足すというような計算式を教えて頂けませんでしょうか。 あと、日毎の残業時間は10分単位で入力するのですが、その月の合計は30分単位にして提出しなければなりません。 例えば、合計が30時間40分~50分の場合は30時間30分にしなければなりませんし、 30時間10分~20分の場合は30時間00分にしなければなりません。 この両方の内容を兼ね備えた計算ができる方法を教えて頂きたく存じます。 分かりにくい文章で、申し訳ありませんがよろしくお願い致します。

  • vb.net datagridviewの列位置変更

    vb.net datagridviewの列位置を変更する方法を教えて下さい。 データグリッドビューにDataTable(DBから抽出したデータ)を割り当てました。 DataGridView1.DataSource = DataTable1 ここに、カラムを追加しました Dim column As New DataGridViewButtonColumn() '列の名前を設定 column.Name = "Button" '全てのボタンに"詳細閲覧"と表示する column.UseColumnTextForButtonValue = True column.Text = "詳細閲覧" 'DataGridViewに追加する DataGridView1.Columns.Add(column) この追加したカラムを一番左に表示したいです。

  • VC++2008にてdouble型の置換について

    現在VC++2008をMFCにて開発しております。VC++は初心者です。 画面から入力される値(小数点以下有り)を ファイル名として利用し出力する為 小数点とマイナスを特定の文字列に置換する処理をおこなっております。 画面から入力される値(CString)をそのままatof変換し、 double型で取得しますと 「3000.00000」のような値になってしまいます。 「3000.10100」のような値も入力される可能性があるので 一慨に小数点以下を丸める事もできません。 そういった事を考慮しますと、どういった処理が考えられるでしょうか? ご教授頂ければ幸いです。

  • DataGridViewに配列の値を表示したい

    VB2008でプログラミングをしています。(超初心者です) タイトルどおり、DataGridViewに一次元配列の値を表示したいと思っています。 最初は、以下のとおりにプログラムを書いてみたのですが、 表示されるのは各要素の長さでした。 dim array() as string = {"data1","data2","data3"} DataGridView1.DataSource = array どのようにすれば、要素の値が表示されるのでしょうか? 出来れば{"data1","data2","data3"}のように、 各要素を書き出さない方法が知りたいです。 (要素数が不確定のため) よろしくお願いいたします。

専門家に質問してみよう