Last active
June 28, 2024 03:20
-
-
Save wilinz/a9364d73b608b48696bcf31423ece3a7 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
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