예제 #1
0
        /// <summary>
        /// 時間のリストから、指定した時間間隔になるような時間を取り出します。
        /// </summary>
        /// <param name="timeList">入力する時間のリスト</param>
        /// <param name="dispTimeSpan">時間間隔の指定</param>
        /// <param name="resultTimeList">指定した時間間隔で取り出した時間のリスト</param>
        /// <param name="resultLabelList">表示のために時間を文字列にしたもの</param>
        void CreateDispTimeList(List <DateTime> timeList, TimeSpan dispTimeSpan, out List <DateTime> resultTimeList, out List <string> resultLabelList, bool displayMinute = false)
        {
            List <DateTime> result      = new List <DateTime> ();
            List <string>   resultLabel = new List <string> ();
            DateTime        first       = timeList.First();
            DateTime        last        = timeList.Last();

            if (isDispStartAndEndTime)
            {
                //始点と終点に開始時刻と終了時刻を表示するなら
                //開始時刻記載
                result.Add(timeList.First());
                resultLabel.Add(CSVManager.ConvertTimeToHHMM(timeList.First()));
                //間の時間記載
                //開始時刻、終了時刻より一定の範囲内の時間(は表示が重複しないようにするため、記載しないようにする
                TimeSpan wholeTime   = timeList.Last() - timeList.First();
                TimeSpan curringTime = dispTimeSpan;
                if (last - first > new TimeSpan(curringTime.Hours * 2, curringTime.Minutes * 2, curringTime.Seconds * 2))                       //全体の時間がマイナスにならないように
                {
                    first = first.Add(curringTime);
                    last  = last.Subtract(curringTime);
                }
            }

            for (int i = 0; i < 100; i++)
            {
                DateTime time  = first.Add(new TimeSpan(dispTimeSpan.Hours * i, dispTimeSpan.Minutes * i, dispTimeSpan.Seconds * i));
                int      year  = time.Year;
                int      month = time.Month;
                int      day   = time.Day;
                int      hour  = time.Hour;
                int      min   = time.Minute;
                int      sec   = time.Second;

                if (dispTimeSpan.Seconds == 0)
                {
                    if (sec > 0)
                    {
                        sec = 0;
                        min++;
                    }
                }
                else
                {
                    sec = dispTimeSpan.Seconds * (sec / dispTimeSpan.Seconds) + dispTimeSpan.Seconds * (sec % dispTimeSpan.Seconds > 0 ? 1 : 0);
                }

                if (dispTimeSpan.Minutes == 0)
                {
                    if (min > 0)
                    {
                        min = 0;
                        hour++;
                    }
                }
                else
                {
                    min = dispTimeSpan.Minutes * (min / dispTimeSpan.Minutes) + dispTimeSpan.Minutes * (min % dispTimeSpan.Minutes > 0 ? 1 : 0);
                }

                if (dispTimeSpan.Hours == 0)
                {
                }
                else
                {
                    hour += hour % dispTimeSpan.Hours;
                }
                //時間正規化
                if (sec >= 60)
                {
                    min += sec / 60;
                    sec  = sec % 60;
                }
                if (min >= 60)
                {
                    hour += min / 60;
                    min   = min % 60;
                }
                if (hour >= 24)
                {
                    day += hour / 24;
                    hour = hour % 24;
                }
                if (day > DateTime.DaysInMonth(year, month))
                {
                    month++;
                    day = 1;
                }
                if (month > 12)
                {
                    year++;
                    month = 1;
                }
                time = new DateTime(year, month, day, hour, min, sec);

                if (isDispStartAndEndTime)
                {
                    bool isSameStart = (time - timeList.First()) < dispTimeSpan;
                    bool isSameEnd   = (timeList.Last() - time) < dispTimeSpan;
                    if (isSameStart || isSameEnd)                       //timeSpanが一分など、短い時間間隔になったときに表示桁数の関係上、秒は違うけど分は同じという重複が発生するため回避する
                    {
                        continue;
                    }
                }
                if (time.CompareTo(last) > 0)
                {
                    break;                      //終了時間を過ぎるなら、終了とみなす
                }
                result.Add(time);

                //表示する時間間隔によって表記を変更する
                if (CSVManager.isInvalidDate(timeList.First()))
                {
                    resultLabel.Add("");
                }
                else if (dispTimeSpan.Seconds > 0)
                {
                    //秒単位で表記が必要なら
                    resultLabel.Add(String.Format("{0:0}", hour) + ":" + String.Format("{0:00}", min) + ":" + String.Format("{0:00}", sec));
                }
                else if (dispTimeSpan.Minutes > 0 || displayMinute)
                {
                    //分単位で表記が必要なら
                    resultLabel.Add(String.Format("{0:0}", hour) + ":" + String.Format("{0:00}", min));
                }
                else
                {
                    //時間単位の表記で良いなら
                    resultLabel.Add(String.Format("{0:0}", hour));
                }
            }

            //表示できる時間が1つもなければ、最後に終了時間を追加する
            bool isNoneDispTime = result.Count == 0;

            if (isDispStartAndEndTime || isNoneDispTime)
            {
                //終了時刻記載
                result.Add(timeList.Last());
                resultLabel.Add(CSVManager.ConvertTimeToHHMM(timeList.Last()));
            }

            resultTimeList  = result;
            resultLabelList = resultLabel;
        }