| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- import 'package:intl/intl.dart';
- import '../resource/assets.gen.dart';
- class AgeZodiacSignUtil {
- AgeZodiacSignUtil._();
- static List<Zodiac> zodiacs = [
- Zodiac(name: '白羊座', image: Assets.images.iconAries),
- Zodiac(name: '金牛座', image: Assets.images.iconTaurus),
- Zodiac(name: '双子座', image: Assets.images.iconGemini),
- Zodiac(name: '巨蟹座', image: Assets.images.iconCancer),
- Zodiac(name: '狮子座', image: Assets.images.iconLeo),
- Zodiac(name: '处女座', image: Assets.images.iconVirgo),
- Zodiac(name: '天秤座', image: Assets.images.iconLibra),
- Zodiac(name: '天蝎座', image: Assets.images.iconScorpio),
- Zodiac(name: '射手座', image: Assets.images.iconSagittarius),
- Zodiac(name: '摩羯座', image: Assets.images.iconCapricorn),
- Zodiac(name: '水瓶座', image: Assets.images.iconAquarius),
- Zodiac(name: '双鱼座', image: Assets.images.iconPisces),
- ];
- /// 计算星座(传入 DateTime)
- /// 通过生日获取 Zodiac 对象(包含名称和图片)
- static Zodiac getZodiacSign(DateTime date) {
- int month = date.month;
- int day = date.day;
- String sign;
- if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) {
- sign = '白羊座';
- } else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) {
- sign = '金牛座';
- } else if ((month == 5 && day >= 21) || (month == 6 && day <= 20)) {
- sign = '双子座';
- } else if ((month == 6 && day >= 21) || (month == 7 && day <= 22)) {
- sign = '巨蟹座';
- } else if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) {
- sign = '狮子座';
- } else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) {
- sign = '处女座';
- } else if ((month == 9 && day >= 23) || (month == 10 && day <= 22)) {
- sign = '天秤座';
- } else if ((month == 10 && day >= 23) || (month == 11 && day <= 21)) {
- sign = '天蝎座';
- } else if ((month == 11 && day >= 22) || (month == 12 && day <= 21)) {
- sign = '射手座';
- } else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) {
- sign = '摩羯座';
- } else if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) {
- sign = '水瓶座';
- } else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) {
- sign = '双鱼座';
- } else {
- return const Zodiac(name: '未知星座', image: AssetGenImage('')); // 空图片占位
- }
- return zodiacs.firstWhere(
- (zodiac) => zodiac.name == sign,
- orElse: () => const Zodiac(name: '未知星座', image: AssetGenImage('')),
- );
- }
- /// 计算年龄(传入 DateTime)
- static int calculateAge(DateTime birthDate) {
- DateTime currentDate = DateTime.now();
- int age = currentDate.year - birthDate.year;
- if (currentDate.month < birthDate.month ||
- (currentDate.month == birthDate.month &&
- currentDate.day < birthDate.day)) {
- age--;
- }
- return age;
- }
- /// 从字符串计算星座
- static Zodiac getZodiacSignFromString(
- String dateStr, {
- String format = 'yyyy-MM-dd',
- }) {
- try {
- DateTime date = DateFormat(format).parse(dateStr);
- return getZodiacSign(date);
- } catch (e) {
- return const Zodiac(name: '未知星座', image: AssetGenImage(''));
- }
- }
- /// 从字符串计算年龄
- static int? calculateAgeFromString(
- String dateStr, {
- String format = 'yyyy-MM-dd',
- }) {
- try {
- DateTime date = DateFormat(format).parse(dateStr);
- return calculateAge(date);
- } catch (e) {
- return null;
- }
- }
- /// 格式化生日(传入字符串)
- static String? formatBirthdayFromString(
- String? dateStr, {
- String outputFormat = 'yyyy-MM-dd',
- }) {
- if (dateStr == null || dateStr.isEmpty) return null;
- final possibleFormats = [
- 'yyyy-MM-dd',
- 'yyyy/MM/dd',
- 'yyyy-MM-dd HH:mm:ss',
- 'yyyy/MM/dd HH:mm:ss',
- "yyyy-MM-dd'T'HH:mm:ss'Z'",
- "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
- 'yyyy-MM-dd HH:mm:sss',
- ];
- for (var format in possibleFormats) {
- try {
- DateTime date = DateFormat(format).parseStrict(dateStr);
- return DateFormat(outputFormat).format(date);
- } catch (e) {
- // 忽略失败,尝试下一个格式
- }
- }
- return null;
- }
- static Zodiac getZodiacWithGenderLabel(
- String birthStr,
- int genderCode, {
- String format = 'yyyy-MM-dd',
- }) {
- final zodiac = getZodiacSignFromString(birthStr, format: format);
- final gender = genderCode == 1 ? '男' : genderCode == 2 ? '女' : '';
- final baseName = zodiac.name.replaceAll('座', '');
- return Zodiac(name: '$baseName$gender', image: zodiac.image);
- }
- }
- class Zodiac {
- final String name;
- final AssetGenImage image;
- const Zodiac({required this.name, required this.image});
- }
- class DateComponents {
- final String yearPart;
- final String monthPart;
- final String dayPart;
- const DateComponents({
- required this.yearPart,
- required this.monthPart,
- required this.dayPart,
- });
- /// 从 DateTime 生成格式化数据
- factory DateComponents.fromDateTime(DateTime date) {
- return DateComponents(
- yearPart: DateFormat('yyyy').format(date),
- monthPart: DateFormat('MM').format(date),
- dayPart: DateFormat('dd').format(date),
- );
- }
- static String getZodiacLabel(Zodiac zodiac, String gender) {
- final name = zodiac.name.replaceAll('座', '');
- return '$name$gender'; // gender: '男' 或 '女'
- }
- String toFormattedString() => '$yearPart年$monthPart月$dayPart日';
- }
|