C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 時刻に関する関数について


(過去ログ 67 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■39146 / inTopicNo.1)  時刻に関する関数について
  
□投稿者/ jin (12回)-(2009/07/30(Thu) 17:46:44)

分類:[VB.NET/VB2005 以降] 

2009/07/30(Thu) 17:47:23 編集(投稿者)

お世話になります。
現在、VB2008を使用してWindowsフォームの開発をしているのですが、

DataGridViewのCellに、値をデータバインドで表示しているのですが、
その中に、時刻の値が入力されたCellがあります。

時刻の値というのは、
例:
9:08
8:56
10:23

などのデータなのですが、これらの値を
30分単位による、切り上げと切捨てを行いたいのです。
例えば、

切上げ
8:56 = 9:00
9:18 = 9:30
12:49 = 13:00

切捨て
17:47 = 17:30
19:08 = 19:00
23:48 = 23:30

という値に変換されたデータを取得したいと考えているのですが、
どなたか、上記の動作を実行するための関数などを
ご存知の方はご教授願えないでしょうか。

よろしくお願いします。
引用返信 編集キー/
■39149 / inTopicNo.2)  Re[1]: 時刻に関する関数について
□投稿者/ .SHO (986回)-(2009/07/30(Thu) 17:57:46)
自分で作ればいいじゃん。
引用返信 編集キー/
■39154 / inTopicNo.3)  Re[2]: 時刻に関する関数について
□投稿者/ jin (13回)-(2009/07/30(Thu) 19:54:26)
2009/07/30(Thu) 20:03:22 編集(投稿者)
2009/07/30(Thu) 20:02:01 編集(投稿者)

<pre><pre>■No39149 (.SHO さん) に返信
.SHOさん、
回答ありがとうございます。

> 自分で作ればいいじゃん。
一応、自分の方で
以下のようなソースを書いてみたのですが、

Private Function IN_IN(ByVal Str As String) As String
'時間の値変換
Dim month As String = ""
Dim Logstr As Integer = 0
Logstr = Len(Str)
If Logstr = 3 Then
month = Microsoft.VisualBasic.Left(Str, 1)
End If
If Logstr = 4 Then
month = Microsoft.VisualBasic.Left(Str, 2)
End If
Dim strVal As String
strVal = Microsoft.VisualBasic.Right(Str, 2)

If strVal >= 1 And strVal <= 30 Then
strVal = "30"

ElseIf strVal >= 31 And strVal <= 59 Then
strVal = "00"
month = month + 1

ElseIf strVal = 0 Then
strVal = "00"
End If

'再び:をつけた時刻型に変換。
Dim atai As String
atai = month + ":" + strVal

IN_IN = atai
End Function

少々情けない感じのソースになってしまうのですが、
単純に、
例えば
9:08 という時刻であれば、
一旦、「:」を外し、

下二桁が、1以上 30以下であれば、00の値を設定することで
900という数値となり、
再び:を付け直すという仕様にしているのですが、

全体的にかなり強引な動きになっているような気がしてしまい、
もう少し要領の良いやり方は無いかと思い、
今回質問させていただきました。

一応、自分でももう少し上記のソースを
修正するつもりではいるのですが、

もし、「このようなやり方もある」という方いらっしゃましたら、
ご教授ください。

よろしくお願いします。
</pre></pre>
引用返信 編集キー/
■39158 / inTopicNo.4)  Re[3]: 時刻に関する関数について
□投稿者/ .SHO (987回)-(2009/07/30(Thu) 20:15:33)
> 一応、自分でももう少し上記のソースを
> 修正するつもりではいるのですが、
> もし、「このようなやり方もある」という方いらっしゃましたら、
> ご教授ください。

やり方はいろいろあるし、それを考えるのがプログラミングの楽しみ。

どーでもいいけど、なんで「:」の前が month なの?^^;
hour でそ。。。
引用返信 編集キー/
■39159 / inTopicNo.5)  Re[3]: 時刻に関する関数について
□投稿者/ .SHO (988回)-(2009/07/30(Thu) 20:28:20)
> 全体的にかなり強引な動きになっているような気がしてしまい、
> もう少し要領の良いやり方は無いかと思い、
> 今回質問させていただきました。

基本的な考え方はいいと思います。
ただ、もう少しスマートに書けそうだけど。


> If Logstr = 3 Then
> month = Microsoft.VisualBasic.Left(Str, 1)
> End If
> If Logstr = 4 Then
> month = Microsoft.VisualBasic.Left(Str, 2)
> End If

ここは、3→4、4→5 ?

> If strVal >= 1 And strVal <= 30 Then
> strVal = "30"
>
> ElseIf strVal >= 31 And strVal <= 59 Then
> strVal = "00"
> month = month + 1
>
> ElseIf strVal = 0 Then
> strVal = "00"
> End If

比較する順番を変えれば「And」いらないですね。
つまり最初に「0」か見て、次に「30以下か」を見て、次に残りを処理。
(変な値は入っていない前提)

引用返信 編集キー/
■39171 / inTopicNo.6)  Re[1]: 時刻に関する関数について
□投稿者/ Jitta on the way (365回)-(2009/07/30(Thu) 22:59:39)
No39146 (jin さん) に返信
> 2009/07/30(Thu) 17:47:23 編集(投稿者)
>
> お世話になります。
> 現在、VB2008を使用してWindowsフォームの開発をしているのですが、
>
> DataGridViewのCellに、値をデータバインドで表示しているのですが、
> その中に、時刻の値が入力されたCellがあります。
>
> 時刻の値というのは、
> 例:
> 9:08
> 8:56
> 10:23
>
> などのデータなのですが、これらの値を
> 30分単位による、切り上げと切捨てを行いたいのです。
> 例えば、
>
> 切上げ
> 8:56 = 9:00
> 9:18 = 9:30
> 12:49 = 13:00
>
> 切捨て
> 17:47 = 17:30
> 19:08 = 19:00
> 23:48 = 23:30
>
> という値に変換されたデータを取得したいと考えているのですが、
> どなたか、上記の動作を実行するための関数などを
> ご存知の方はご教授願えないでしょうか。
>
> よろしくお願いします。



文字列から、DateTime などにパースする。→時間と分を、数値で取り出せる。

30分単位に丸めたいので、分に変換(時間に60を掛けて、分を足す)。

30で割る。
切り捨て→余りを捨てる。
切り上げ→余りがあるなら、商に1足す。

30を掛ける。

時間と分に分離。
引用返信 編集キー/
■39172 / inTopicNo.7)  Re[3]: 時刻に関する関数について
□投稿者/ やじゅ (1160回)-(2009/07/30(Thu) 23:18:15)
やじゅ さんの Web サイト
No39154 (jin さん) に返信
> 全体的にかなり強引な動きになっているような気がしてしまい、
> もう少し要領の良いやり方は無いかと思い、
> 今回質問させていただきました。
>

1.「:」をSplit関数で区切って、TimeSpan型にセット
2.TimeSpan型にしてAddメソッドで、30分加算または減算するとかする 30分単位で切上げ/切捨て
3.分が30未満なら分を00に再セット、それ以外は分を30にして再セット
4.TimeSpan型から、ToStringメソッドで時分に変換
 http://www.atmarkit.co.jp/fdotnet/dotnettips/329timeformat/timeformat.html

引用返信 編集キー/
■39183 / inTopicNo.8)  Re[2]: 時刻に関する関数について
□投稿者/ とりの (3回)-(2009/07/31(Fri) 09:34:25)
9:15 → 9.25
9:30 → 9.5

とかに簡単にできればスマートそうではあるが・・・
引用返信 編集キー/
■39198 / inTopicNo.9)  Re[3]: 時刻に関する関数について
□投稿者/ みきぬ (573回)-(2009/07/31(Fri) 12:30:29)
Function 切り上げ(ByVal s As String) As String
    Return Date.ParseExact(s, "H:mm", Nothing).AddMinutes((60 - Right(s, 2)) Mod 30).ToString("H:mm")
End Function

Function 切り捨て(ByVal s As String) As String
    Return Date.ParseExact(s, "H:mm", Nothing).AddMinutes(-(Right(s, 2) Mod 30)).ToString("H:mm")
End Function

これをスマートというかどうかは知らない。

引用返信 編集キー/
■39209 / inTopicNo.10)  Re[4]: 時刻に関する関数について
□投稿者/ jin (14回)-(2009/07/31(Fri) 14:04:15)
皆さん様々な情報の提供、ありがとうございます。

みきぬさんの乗せていただいたコードで、
目的の値に変換することが出来ましたので、
一応、解決いたしました。

.SHOさん、
>やり方はいろいろあるし、それを考えるのがプログラミングの楽しみ。
今後はそれを意識して、作成していきたいと思います。
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -