Created
July 6, 2023 05:38
-
-
Save iorionda/ae18f475c004069f345cd71def4a084c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void main () { | |
DateTime startDayShift = DateTime(2023, 7, 5, 8, 20); // 7月5日の8:20開始 | |
DateTime endDayShift = DateTime(2023, 7, 5, 18, 20); // 7月5日の18:20終了 | |
DateTime startNightShift = DateTime(2023, 7, 5, 20, 35); // 7月5日の20:35開始 | |
DateTime endNightShift = DateTime(2023, 7, 6, 5, 35); // 7月6日の5:35終了 | |
print("日勤"); | |
Duration totalDayShiftDuration = calculateTotalDuration(startDayShift, endDayShift, excludedRanges); | |
int totalDayShiftDurationInMinutes = totalDayShiftDuration.inMinutes; | |
print('昼勤計算結果 => $totalDayShiftDurationInMinutes 分'); | |
print("-----"); | |
print("夜勤"); | |
Duration totalNightShiftDuration = calculateTotalDuration(startNightShift, endNightShift, excludedRanges); | |
int totalNightShiftDurationInMinutes = totalNightShiftDuration.inMinutes; | |
print('夜勤計算結果 => $totalNightShiftDurationInMinutes 分'); | |
} | |
List<TimeRange> excludedRanges = [ | |
// 日勤の除外時間 | |
TimeRange(startHour: 10, startMinute: 5, endHour: 10, endMinute: 15), | |
TimeRange(startHour: 12, startMinute: 0, endHour: 13, endMinute: 15), | |
TimeRange(startHour: 15, startMinute: 0, endHour: 15, endMinute: 10), | |
TimeRange(startHour: 17, startMinute: 10, endHour: 17, endMinute: 20), | |
// 夜勤の除外時間 | |
TimeRange(startHour: 22, startMinute: 30, endHour: 22, endMinute: 40), | |
TimeRange(startHour: 24 + 0, startMinute: 30, endHour: 24 + 1, endMinute: 30), | |
TimeRange(startHour: 24 + 3, startMinute: 0, endHour: 24 + 3, endMinute: 10), | |
TimeRange(startHour: 24 + 4, startMinute: 30, endHour: 24 + 4, endMinute: 40), | |
]; | |
Duration calculateTotalDuration(DateTime startTime, DateTime endTime, List<TimeRange> excludedRanges) { | |
Duration totalDuration = endTime.difference(startTime); | |
for (final range in excludedRanges) { | |
DateTime rangeStartTime = DateTime(startTime.year, startTime.month, startTime.day, range.startHour, range.startMinute); | |
DateTime rangeEndTime = DateTime(startTime.year, startTime.month, startTime.day, range.endHour, range.endMinute); | |
if (rangeEndTime.isBefore(rangeStartTime)) { | |
rangeEndTime = rangeEndTime.add(const Duration(days: 1)); | |
} | |
if (rangeStartTime.isAfter(rangeEndTime)) { | |
rangeStartTime = rangeStartTime.subtract(const Duration(days: 1)); | |
} | |
if (rangeStartTime.isBefore(endTime) && rangeEndTime.isAfter(startTime)) { | |
Duration excludedDuration = rangeEndTime.difference(rangeStartTime); | |
totalDuration -= excludedDuration; | |
print('この時間帯が除外されました: ${range.startHour.toString().padLeft(2, '0')}:${range.startMinute.toString().padLeft(2, '0')} - ${range.endHour.toString().padLeft(2, '0')}:${range.endMinute.toString().padLeft(2, '0')}'); | |
} | |
} | |
return totalDuration; | |
} | |
class TimeRange { | |
final int startHour; | |
final int startMinute; | |
final int endHour; | |
final int endMinute; | |
TimeRange({ | |
required this.startHour, | |
required this.startMinute, | |
required this.endHour, | |
required this.endMinute, | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment