/// <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; }