Skip to content

Instantly share code, notes, and snippets.

@wilinz
Last active June 28, 2024 03:20
Show Gist options
  • Save wilinz/a9364d73b608b48696bcf31423ece3a7 to your computer and use it in GitHub Desktop.
Save wilinz/a9364d73b608b48696bcf31423ece3a7 to your computer and use it in GitHub Desktop.
计算调休的假日该上哪一天的课
import 'package:dart_extensions/dart_extensions.dart';
import 'package:intl/intl.dart';
import 'package:lunar/lunar.dart';
List<Map<String, String>> calculateAdjustedWorkdayRelationship(
{required List<Holiday> holidays,
required String holidayName,
required int Function(String holidayName) getHolidayLength}) {
final dataTimeFormat = DateFormat("yyyy-MM-dd");
final holidayDays =
holidays.map((e) => dataTimeFormat.parse(e.getDay())).toList();
final trueHoliday = holidays.filter((e) => !e.isWork()).toList();
final trueHolidayDays =
trueHoliday.map((e) => dataTimeFormat.parse(e.getDay())).toList();
final holidayRawStartDay =
dataTimeFormat.parse(trueHoliday.first.getTarget());
final holidayRawDay = getHolidayLength(holidayName);
final holidayRawDays = <DateTime>[];
for (int i = 0; i < holidayRawDay; i++) {
holidayRawDays.add(holidayRawStartDay.add(Duration(days: i)));
}
final holidayRawDaysCopy = List.from(holidayRawDays);
var i = 1;
for (final day in holidayRawDays) {
// 2020
if (day.isWeekend()) {
var newDay =
holidayRawDays[holidayRawDays.length - 1].add(Duration(days: i));
while (true) {
if (newDay.isWeekend()) {
i++;
newDay = newDay.add(Duration(days: 1));
} else {
break;
}
}
holidayRawDaysCopy.add(newDay);
i++;
}
}
final originalDaysByAdjustedWorkDays = <DateTime>[];
for (final day in trueHolidayDays) {
if (!day.isWeekend() && !holidayRawDaysCopy.contains(day)) {
originalDaysByAdjustedWorkDays.add(day);
}
}
final adjustedWorkDays =
holidayDays.where((day) => !trueHolidayDays.contains(day)).toList();
final adjustedDaysList = <Map<String, String>>[];
for (int j = 0; j < adjustedWorkDays.length; j++) {
try {
final adjustedDaysMap = {
"name": holidayName,
"target": trueHoliday.last.getTarget(),
"adjusted_workday": dataTimeFormat.format(adjustedWorkDays[j]),
"original_day":
dataTimeFormat.format(originalDaysByAdjustedWorkDays[j]),
};
adjustedDaysList.add(adjustedDaysMap);
} catch (e) {
print(e);
print(holidayName);
print(trueHoliday.first.getName());
rethrow;
}
}
return adjustedDaysList;
}
main() {
final holidaysYear = HolidayUtil.getHolidaysByYear(2024);
final nationalDayAndMidAutumnFestival =
holidaysYear.firstOrNullWhere((e) => e.getName() == "国庆中秋") != null;
final holidays = holidaysYear.groupBy((Holiday e) => getHolidayGroupName(e));
print(holidays);
final result = holidays.entries
.map((e) => calculateAdjustedWorkdayRelationship(
holidays: e.value,
holidayName: getHolidayGroupName(e.value.first),
getHolidayLength: (name) =>
getHolidayLenght(name, nationalDayAndMidAutumnFestival)))
.toList();
for (final e in result) {
print(e);
}
}
int getHolidayLenght(String name, bool nationalDayAndMidAutumnFestival) {
if (RegExp("春节|国庆").hasMatch(name)) {
if (nationalDayAndMidAutumnFestival && name.contains("国庆")) {
return 4;
}
return 3;
}
return 1;
}
String getHolidayGroupName(Holiday e) => e.getName().contains("国庆中秋")
? e.getName().replaceAll("国庆中秋", "国庆节")
: e.getName();
extension WeekendExt on DateTime {
bool isWeekend() {
return weekday == 6 || weekday == 7;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment