J'ai une telle entité :
class Sign {
Sign._(
this.name,
this.startDate,
this.endDate,
);
static final Sign ARIES = Sign._(
'Aries',
DateTime(0, DateTime.march, 21),
DateTime(0, DateTime.april, 19),
);
static final Sign TAURUS = Sign._(
'Taurus',
DateTime(0, DateTime.april, 20),
DateTime(0, DateTime.may, 20),
);
static final Sign GEMINI = Sign._(
'Gemini',
DateTime(0, DateTime.may, 21),
DateTime(0, DateTime.june, 20),
);
static final Sign CANCER = Sign._(
'Cancer',
DateTime(0, DateTime.june, 21),
DateTime(0, DateTime.july, 22),
);
static final Sign LEO = Sign._(
'Leo',
DateTime(0, DateTime.july, 23),
DateTime(0, DateTime.august, 22),
);
static final Sign VIRGO = Sign._(
'Virgo',
DateTime(0, DateTime.august, 23),
DateTime(0, DateTime.september, 22),
);
static final Sign LIBRA = Sign._(
'Libra',
DateTime(0, DateTime.september, 23),
DateTime(0, DateTime.october, 22),
);
static final Sign SCORPIO = Sign._(
'Scorpio',
DateTime(0, DateTime.october, 23),
DateTime(0, DateTime.november, 21),
);
static final Sign SAGITTARIUS = Sign._(
'Sagittarius',
DateTime(0, DateTime.november, 22),
DateTime(0, DateTime.december, 21),
);
static final Sign CAPRICORN = Sign._(
'Capricorn',
DateTime(0, DateTime.december, 22),
DateTime(0, DateTime.january, 19),
);
static final Sign AQUARIUS = Sign._(
'Aquarius',
DateTime(0, DateTime.january, 20),
DateTime(0, DateTime.february, 18),
);
static final Sign PISCES = Sign._(
'Pisces',
DateTime(0, DateTime.february, 19),
DateTime(0, DateTime.march, 20),
);
final String name;
final DateTime startDate;
final DateTime endDate;
static List<Sign> toList() => <Sign>[
ARIES,
TAURUS,
GEMINI,
CANCER,
LEO,
VIRGO,
LIBRA,
SCORPIO,
SAGITTARIUS,
CAPRICORN,
AQUARIUS,
PISCES,
];
static Sign fromName(String name) {
return toList().firstWhere(
(Sign sign) => name != null && sign.name.trim().toLowerCase() == name.trim().toLowerCase(),
orElse: () => null,
);
}
@override
String toString() => name;
}
et la fonction de détermination :
Sign determineSign(DateTime date) {
if ((date.month == DateTime.december && date.day >= Sign.CAPRICORN.startDate.day) ||
(date.month == DateTime.january && date.day <= Sign.CAPRICORN.endDate.day)) {
return Sign.CAPRICORN;
} else {
return Sign.toList().where((Sign sign) => _isDateInSign(sign, date)).first;
}
}
bool _isDateInSign(Sign sign, DateTime date) {
return sign.startDate.month * 100 + sign.startDate.day <= date.month * 100 + date.day &&
date.month * 100 + date.day <= sign.endDate.month * 100 + sign.endDate.day;
}