library utils; import 'package:intl/intl.dart'; /// date_utils(version:0.1.0+2) : https://github.com/apptreesoftware/date_utils /// @Author: aleksanderwozniak /// @GitHub: https://github.com/aleksanderwozniak/table_calendar /// @Description: Date Util. class DateUtils { static final DateFormat _monthFormat = DateFormat('MMMM yyyy'); static final DateFormat _dayFormat = DateFormat('dd'); static final DateFormat _firstDayFormat = DateFormat('MMM dd'); static final DateFormat _fullDayFormat = DateFormat('EEE MMM dd, yyyy'); static final DateFormat _apiDayFormat = DateFormat('yyyy-MM-dd'); static final DateFormat _apiDayFormat2 = DateFormat('yy.MM.dd'); static String formatMonth(DateTime d) => _monthFormat.format(d); static String formatDay(DateTime d) => _dayFormat.format(d); static String formatFirstDay(DateTime d) => _firstDayFormat.format(d); static String fullDayFormat(DateTime d) => _fullDayFormat.format(d); static String apiDayFormat(DateTime d) => _apiDayFormat.format(d); static String apiDayFormat2(DateTime d) => _apiDayFormat2.format(d); static const List weekdays = [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]; /// 周一开始 static List daysInMonth(DateTime month) { final first = firstDayOfMonth(month); final daysBefore = first.weekday - 1; var firstToDisplay = first.subtract(Duration(days: daysBefore)); if (firstToDisplay.hour == 23) { firstToDisplay = firstToDisplay.add(const Duration(hours: 1)); } var last = lastDayOfMonth(month); if (last.hour == 23) { last = last.add(const Duration(hours: 1)); } var daysAfter = 7 - last.weekday; daysAfter++; var lastToDisplay = last.add(Duration(days: daysAfter)); if (lastToDisplay.hour == 1) { lastToDisplay = lastToDisplay.subtract(const Duration(hours: 1)); } return daysInRange(firstToDisplay, lastToDisplay).toList(); } static bool isFirstDayOfMonth(DateTime day) { return isSameDay(firstDayOfMonth(day), day); } static bool isLastDayOfMonth(DateTime day) { return isSameDay(lastDayOfMonth(day), day); } static DateTime firstDayOfMonth(DateTime month) { return DateTime(month.year, month.month); } static DateTime firstDayOfWeek(DateTime day) { /// Handle Daylight Savings by setting hour to 12:00 Noon /// rather than the default of Midnight day = DateTime.utc(day.year, day.month, day.day, 12); /// Weekday is on a 1-7 scale Monday - Sunday, /// This Calendar works from Sunday - Monday final decreaseNum = day.weekday % 7; return day.subtract(Duration(days: decreaseNum)); } static DateTime lastDayOfWeek(DateTime day) { /// Handle Daylight Savings by setting hour to 12:00 Noon /// rather than the default of Midnight day = DateTime.utc(day.year, day.month, day.day, 12); /// Weekday is on a 1-7 scale Monday - Sunday, /// This Calendar's Week starts on Sunday final increaseNum = day.weekday % 7; return day.add(Duration(days: 7 - increaseNum)); } /// The last day of a given month static DateTime lastDayOfMonth(DateTime month) { final beginningNextMonth = (month.month < 12) ? DateTime(month.year, month.month + 1) : DateTime(month.year + 1); return beginningNextMonth.subtract(const Duration(days: 1)); } /// Returns a [DateTime] for each day the given range. /// /// [start] inclusive /// [end] exclusive static Iterable daysInRange(DateTime start, DateTime end) sync* { var i = start; var offset = start.timeZoneOffset; while (i.isBefore(end)) { yield i; i = i.add(const Duration(days: 1)); final timeZoneDiff = i.timeZoneOffset - offset; if (timeZoneDiff.inSeconds != 0) { offset = i.timeZoneOffset; i = i.subtract(Duration(seconds: timeZoneDiff.inSeconds)); } } } /// Whether or not two times are on the same day. static bool isSameDay(DateTime a, DateTime b) { return a.year == b.year && a.month == b.month && a.day == b.day; } static bool isSameWeek(DateTime a, DateTime b) { /// Handle Daylight Savings by setting hour to 12:00 Noon /// rather than the default of Midnight a = DateTime.utc(a.year, a.month, a.day); b = DateTime.utc(b.year, b.month, b.day); final diff = a.toUtc().difference(b.toUtc()).inDays; if (diff.abs() >= 7) { return false; } final min = a.isBefore(b) ? a : b; final max = a.isBefore(b) ? b : a; final result = max.weekday % 7 - min.weekday % 7 >= 0; return result; } static DateTime previousMonth(DateTime m) { var year = m.year; var month = m.month; if (month == 1) { year--; month = 12; } else { month--; } return DateTime(year, month); } static DateTime nextMonth(DateTime m) { var year = m.year; var month = m.month; if (month == 12) { year++; month = 1; } else { month++; } return DateTime(year, month); } static DateTime previousWeek(DateTime w) { return w.subtract(const Duration(days: 7)); } static DateTime nextWeek(DateTime w) { return w.add(const Duration(days: 7)); } static String previousWeekToString(DateTime w) { return apiDayFormat2(w.subtract(const Duration(days: 6))); } static DateTime nextDay(DateTime w) { return w.add(const Duration(days: 1)); } static List daysInWeek(DateTime week) { final first = _firstDayOfWeek(week); final last = _lastDayOfWeek(week); final days = daysInRange(first, last); return days.map((day) => DateTime(day.year, day.month, day.day)).toList(); } static DateTime _firstDayOfWeek(DateTime day) { day = DateTime.utc(day.year, day.month, day.day, 12); final decreaseNum = day.weekday - 1; return day.subtract(Duration(days: decreaseNum)); } static DateTime _lastDayOfWeek(DateTime day) { day = DateTime.utc(day.year, day.month, day.day, 12); final increaseNum = day.weekday - 1; return day.add(Duration(days: 7 - increaseNum)); } static bool isExtraDay(DateTime day, DateTime now) { return _isExtraDayBefore(day, now) || _isExtraDayAfter(day, now); } static bool _isExtraDayBefore(DateTime day, DateTime now) { return day.month < now.month; } static bool _isExtraDayAfter(DateTime day, DateTime now) { return day.month > now.month; } } class AgeByBirthUtils { static int getAge(DateTime brt) { int age = 0; DateTime dateTime = DateTime.now(); if (dateTime.isAfter(brt)) { return 0; } int yearNow = dateTime.year; int monthNow = dateTime.month; int dayOfMonthNow = dateTime.day; int yearBirth = brt.year; int monthBirth = brt.month; int dayOfMonthBirth = brt.day; age = yearNow - yearBirth; if (monthNow <= monthBirth) { if (monthNow == monthBirth) { if (dayOfMonthNow < dayOfMonthBirth) age--; } else { age--; } } return age; } }