Time span の使い方

タグの編集
投稿者 RJ  (社会人) 投稿日時 2016/9/30 13:32:33
ご質問です

Timespanを使用して

例えば

8:15~9:00まで textbox1に”テスト”を表示させ
9:00~10:00になると textbox2に”テスト②を表示させたり

時間による制御はどのようにプログラムしていけばいいでしょうか??


よろしければ教えてください。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/9/30 14:41:18
『時間』と『時刻』を混同しているように見受けました。
今回の制御で TimeSpan が使われる事は無いと思います。


まず、「8:15」や「9:00」は『時刻』です。
ある瞬間の DateTime 値を示しますね。

一方、TimeSpan 値は『時間』を意味します。
「45分間」とか、「0.75 時間」といった経過時間を表すものであり、
その期間が、いつからいつまでであるのかを示すものではありません。


> 時間による制御はどのようにプログラムしていけばいいでしょうか??
タスク スケジューラ を使うのが一番楽だと思います。

http://www2.biglobe.ne.jp/sota/backup-qa/qa-1-10.html
投稿者 RJ  (社会人) 投稿日時 2016/9/30 14:48:33
魔界の仮面弁士   様 

お返事ありがとうございます

Time Spanで時間管理しているプログラムを見て
どーいう構造なのか 質問させて頂きました。



DataTimeで時間内表示とかもできるのでしょうか?

DetaTime=Nowとか現在時刻表示ぐらいしか
知らないレベルなので

できれは教えてください。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/9/30 15:06:57
> 8:15~9:00まで textbox1に”テスト”を表示させ
> 9:00~10:00になると textbox2に”テスト②を表示させたり

このパターンなら、Form に Timer を貼っておくのが簡単かな。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Timer1.Interval = 適当な監視間隔をミリ秒単位で指定

    Timer1.Start()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim dt As Date = Now
    Dim hm As Integer = dt.Hour * 100 + dt.Minute

    If 815 <= hm AndAlso hm < 900 Then
        TextBox1.Text = "テスト"
        TextBox1.ReadOnly = True
    Else
        TextBox1.ReadOnly = False
    End If

    If 900 <= hm And hm < 1000 Then
        TextBox2.Text = "テスト②"
        TextBox2.ReadOnly = True
    Else
        TextBox2.ReadOnly = False
    End If
End Sub
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/9/30 15:18:23
ReadOnly を付けたのは、ユーザーの編集を防ぐためです。

時間外になったときの表示をどうするのかは、特に指示が
無かったので、表示させた "テスト" 表記をクリアしたりはせず
そのままにしています。単に ReadOnly が解除されるだけです。

都合が悪ければ、必要に応じて適宜修正して下さい。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/9/30 15:48:17
あえて TimeSpan を使ってみました。
Else 句の実装は省略しています。

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim span As TimeSpan = Now - Today
    Dim h As Double = span.TotalHours

    If 8.25 <= h AndAlso h < 9.0 Then
        TextBox1.Text = "テスト"
    End If

    If 9.0 < h AndAlso h < 10.0 Then
        TextBox2.Text = "テスト②"
    End If
End Sub



なお、VB.NET のバージョンが 2002 や 2003 の場合は
日付同士の減算をサポートしていないので、最初の行を
「Dim span As TimeSpan = Now.Subtract(Today)」に置き換えてください。
投稿者 RJ  (社会人) 投稿日時 2016/9/30 15:56:02
魔界の仮面弁士 様

さっそくやってみました!できました
ありがとうございます

何もしてない時間はクリアーにするにはこれでよろしいでしょうか??

ちょうど15:40からでスタートしています

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim dt As Date = Now
        Dim hm As Integer = dt.Hour * 100 + dt.Minute

        If 1540 <= hm AndAlso hm < 1550 Then
            TextBox1.Text = "テスト"
            TextBox1.ReadOnly = True
        Else
            TextBox1.ReadOnly = False
        End If

    If 1550<= hm AndAlso hm < 1600 Then
            TextBox1.Text = ""
            TextBox1.ReadOnly = True
        Else
            TextBox1.ReadOnly = False
        End If

        If 1600 <= hm And hm < 1610 Then
            TextBox2.Text = "テスト②"
            TextBox2.ReadOnly = True
        Else
            TextBox2.ReadOnly = False
        End If

    End Sub
End Class


他の時間帯になると
textboxは表示されてるままになりますよね?

もし表示したくなければ
あとの時間の処理に""をすれば

よろしいでしょうか??

Timespanでも試してみて
できました

非常にわかりやすくてすごく助かります
ありがとうございます。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/9/30 16:23:59
> 何もしてない時間はクリアーにするにはこれでよろしいでしょうか??
「何もしていない時間」にクリアする処理はこんな感じです。

If 1540 <= hm AndAlso hm < 1550 Then
 TextBox1.Text = "テスト"
Else
 TextBox1.Clear()
End If



しかし、ユーザーが何か入力しても、すぐにクリアされてしまうため、
これを定期的に呼び出すと、TextBox の意味が無くなってしまいます。

ユーザー入力がありえないなら、そもそも TextBox を使う必要は無く、
Label で十分だと思います。あるいは ReadOnly にしておくとか。


> ちょうど15:40からでスタートしています
そういう場合は、ElseIf を使いましょう。

If 1540 <= hm AndAlso hm < 1550 Then
    TextBox1.Text = "テスト"
    TextBox1.ReadOnly = True
ElseIf 1550<= hm AndAlso hm < 1600 Then
    TextBox1.Text = ""
    TextBox1.ReadOnly = True
Else
    TextBox1.ReadOnly = False
End If



> 他の時間帯になると
> textboxは表示されてるままになりますよね?
編集可能になるだけで、入力内容は元のままですね。



> もし表示したくなければ
> あとの時間の処理に""をすれば
> よろしいでしょうか??
どこにどのように記述しようとしているのか
質問文からは読み取れなかったので、
ひとまず、実際にやってみてください。


> 非常にわかりやすくてすごく助かります
応用すれば、24時を跨いだ時間帯を指定したり、
「毎月10日の14時台」などといった指定もできますね。
投稿者 RJ  (社会人) 投稿日時 2016/9/30 16:41:09
魔界の仮面弁士 様

ありがとうございます
早速 色々試してみます

ありがとうございました。