Skip to content

Instantly share code, notes, and snippets.

@iorionda
Created July 6, 2023 05:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iorionda/ae18f475c004069f345cd71def4a084c to your computer and use it in GitHub Desktop.
Save iorionda/ae18f475c004069f345cd71def4a084c to your computer and use it in GitHub Desktop.
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