プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

C#でタイムカードアプリを作った

私の会社での勤務時間は、自分で出退勤時間をweb上で入力することになっている。
私は現在、社会人として3社目だが2社目が一時期 ID Cardの記録から自動反映であった以外は、すべて自身で入力する形である。
世の中的にはまだこんな無駄な作業が行われているのが一般的なのがありえないと思っている。
そうはいっても、そこそこまじめに勤務記録をつけないわけにもいかないが、朝はあわただしいし、帰りはそれはそれで電車の時間を気にしたりであわただしいので、月末にまとめて入力したりする。

そんなことのために、PCの起動終了時間を記録するアプリを作った。
一般にはブートロガーというらしい。
Vectorなどにも探せばあるのだが、2日目からなぜか動かなくなったので、自分で作ったものを使っている。
1月半ほど使って安定動作しているので、バグ出しOKということで公開します。
UIは↓の練習問題で作ったアラーム・タイマーのアプリを流用した。

↓こんな感じ。
f:id:s51517765:20171221222811j:plain

元の時計の動作用のTimerとは別にTimerを用意し、時計の動作に影響しないように、”hh:mm:00:500”で更新するようにしている。
”hh:mm:00:000”で更新しようとすると、時計が一瞬とは言え止まって見えてしまうため。

これをwindowsのスタートアップに登録しておけば良い。

using System.IO;

 public partial class Form1 : Form
    {
        private bool openToday = false;
        private DateTime [] timeStartEnd=new DateTime[2];
  }
private void timer2_Tick(object sender, EventArgs e)
        {
            if (openToday == false)
            {
                //起動時刻取得
                timeStartEnd[0] = DateTime.Now;
                openToday = true;
                System.Threading.Thread.Sleep(1000); //1秒停止
            }
            DateTime now = DateTime.Now;
            if (now.Second == 0&& now.Millisecond>500) //時計が止まる対策
            {                         
                    //現在時刻を終了時刻として書き込む&覚える
                    timeStartEnd[1] = DateTime.Now;
                    System.Threading.Thread.Sleep(500); //0.5秒停止                
                try
                {
                    using (StreamWriter writer = new StreamWriter("timecard.txt", true, System.Text.Encoding.GetEncoding("utf-8")))
                    {
                      // Logファイルがあるかどうか確認
                    }
                }
                catch
                {
                    using (StreamWriter writer = new StreamWriter("timecard.txt", true, System.Text.Encoding.GetEncoding("utf-8")))
                    {
                        //ファイルがないときの処理
                        writer.Write("timecard" + System.Environment.NewLine);
                    }
                }
            
            //テキストファイルからすべての行を読み込む
            string[] line = System.IO.File.ReadAllLines("timecard.txt");
            try
            {
                //最後の1行を削除する
                if (line[line.Length-1 ] == "")
                {
                    line = line.Take(line.Length - 1).ToArray();
                }
                else //最後の一行が空白でなければ
                {
                    string[] lastLine = line[line.Length - 1].Split(' ');
                    if (lastLine[0] == now.ToString("MM/dd"))       //今日のData
                    {
                        timeStartEnd[0] = DateTime.Parse(lastLine[3]); //文字列をDatetimeにparse
                        line = line.Take(line.Length - 1).ToArray();
                    }
                }
                System.IO.File.WriteAllLines("timecard.txt", line);
            }
            catch
            {
                //pass
            }

            //書き込む
            using (StreamWriter writer = new StreamWriter("timecard.txt", true, System.Text.Encoding.GetEncoding("utf-8")))
            {
                writer.Write(now.ToString("MM/dd dddd") + " Start " + timeStartEnd[0].ToShortTimeString() + " End " + timeStartEnd[1].ToShortTimeString()+ System.Environment.NewLine);                    
                writer.Close();
            }
            }

f:id:s51517765:20171221223751j:plain

Vectorで公開しました。

公開ファイルはタスクトレイ常駐でタイムカード機能のみのものにしました。
www.vector.co.jp