import 'package:intl/intl.dart'; class DateFormats { static String full = 'yyyy-MM-dd HH:mm:ss'; static String yMoDHM = 'yyyy-MM-dd HH:mm'; static String yMoD = 'yyyy-MM-dd'; static String yMo = 'yyyy-MM'; static String moD = 'MM-dd'; static String moDHM = 'MM-dd HH:mm'; static String hMS = 'HH:mm:ss'; static String hM = 'HH:mm'; static String zhFull = 'yyyy年MM月dd日 HH时mm分ss秒'; static String zhYMoDHM = 'yyyy年MM月dd日 HH时mm分'; static String zhYMoD = 'yyyy年MM月dd日'; static String zhYMo = 'yyyy年MM月'; static String zhMoD = 'MM月dd日'; static String zhMoDHM = 'MM月dd日 HH时mm分'; static String zhHMS = 'HH时mm分ss秒'; static String zhHM = 'HH时mm分'; } class TDateUtils { /// 月->天数. static Map monthDay = { 1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31, }; /// 获取当前时间,默认格式(yyyy-MM-dd HH:mm:ss) static String getNowTimeStr({String? format}) { return formatDate(DateTime.now(), format: format); } /// 获取当前时间戳 static int getNowTimestamp() { return DateTime.now().millisecondsSinceEpoch; } /// 以毫秒为单位格式化日期 static String formatDateMs(int ms, {bool isUtc = false, String? format}) { return formatDate(getDateTimeByMs(ms, isUtc: isUtc), format: format); } /// 毫秒 转 DateTime static DateTime getDateTimeByMs(int ms, {bool isUtc = false}) { return DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc); } /// 日期str 转 毫秒 static int? getDateMsByTimeStr(String dateStr, {bool? isUtc}) { DateTime? dateTime = getDateTime(dateStr, isUtc: isUtc); return dateTime?.millisecondsSinceEpoch; } /// 按日期str格式化日期 static String formatDateStr(String dateStr, {bool? isUtc, String? format}) { return formatDate(getDateTime(dateStr, isUtc: isUtc), format: format); } /// 日期str 转 DateTime static DateTime? getDateTime(String dateStr, {bool? isUtc}) { DateTime? dateTime = DateTime.tryParse(dateStr); if (isUtc != null) { if (isUtc) { dateTime = dateTime?.toUtc(); } else { dateTime = dateTime?.toLocal(); } } return dateTime; } /// 按DateTime格式化日期 /// format 转换格式(已提供常用格式 DateFormats,可以自定义格式:'yyyy/MM/dd HH:mm:ss') /// 格式要求 /// year -> yyyy/yy month -> MM/M day -> dd/d /// hour -> HH/H minute -> mm/m second -> ss/s static String formatDate(DateTime? dateTime, {String? format}) { if (dateTime == null) return ''; format = format ?? DateFormats.full; if (format.contains('yy')) { String year = dateTime.year.toString(); if (format.contains('yyyy')) { format = format.replaceAll('yyyy', year); } else { format = format.replaceAll( 'yy', year.substring(year.length - 2, year.length)); } } format = _comFormat(dateTime.month, format, 'M', 'MM'); format = _comFormat(dateTime.day, format, 'd', 'dd'); format = _comFormat(dateTime.hour, format, 'H', 'HH'); format = _comFormat(dateTime.minute, format, 'm', 'mm'); format = _comFormat(dateTime.second, format, 's', 'ss'); format = _comFormat(dateTime.millisecond, format, 'S', 'SSS'); return format; } static String _comFormat(int value, String format, String single, String full) { if (format.contains(single)) { if (format.contains(full)) { format = format.replaceAll(full, value < 10 ? '0$value' : value.toString()); } else { format = format.replaceAll(single, value.toString()); } } return format; } /// 工作日 /// dateTime /// isUtc /// languageCode zh or en /// short static String getWeekday(DateTime? dateTime, {String languageCode = 'zh', bool short = false}) { if (dateTime == null) return ''; String weekday = ''; switch (dateTime.weekday) { case 1: weekday = languageCode == 'zh' ? '星期一' : 'Monday'; break; case 2: weekday = languageCode == 'zh' ? '星期二' : 'Tuesday'; break; case 3: weekday = languageCode == 'zh' ? '星期三' : 'Wednesday'; break; case 4: weekday = languageCode == 'zh' ? '星期四' : 'Thursday'; break; case 5: weekday = languageCode == 'zh' ? '星期五' : 'Friday'; break; case 6: weekday = languageCode == 'zh' ? '星期六' : 'Saturday'; break; case 7: weekday = languageCode == 'zh' ? '星期日' : 'Sunday'; break; default: break; } return languageCode == 'zh' ? (short ? weekday.replaceAll('星期', '周') : weekday) : weekday.substring(0, short ? 3 : weekday.length); } /// 以毫秒计算工作日 static String getWeekdayByMs(int milliseconds, {bool isUtc = false, String languageCode = 'zh', bool short = false}) { DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc); return getWeekday(dateTime, languageCode: languageCode, short: short); } /// 在今年的第几天 static int getDayOfYear(DateTime dateTime) { int year = dateTime.year; int month = dateTime.month; int days = dateTime.day; for (int i = 1; i < month; i++) { days = days + monthDay[i]!; } if (isLeapYearByYear(year) && month > 2) { days = days + 1; } return days; } /// 在今年的第几天 static int getDayOfYearByMs(int ms, {bool isUtc = false}) { return getDayOfYear(DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc)); } /// 是否是当天 static bool isToday(int? milliseconds, {bool isUtc = false, int? locMs}) { if (milliseconds == null || milliseconds == 0) return false; DateTime old = DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: isUtc); DateTime now; if (locMs != null) { now = TDateUtils.getDateTimeByMs(locMs); } else { now = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal(); } return old.year == now.year && old.month == now.month && old.day == now.day; } /// 是否是昨天. static bool isYesterday(DateTime dateTime, DateTime locDateTime) { if (yearIsEqual(dateTime, locDateTime)) { int spDay = getDayOfYear(locDateTime) - getDayOfYear(dateTime); return spDay == 1; } else { return ((locDateTime.year - dateTime.year == 1) && dateTime.month == 12 && locDateTime.month == 1 && dateTime.day == 31 && locDateTime.day == 1); } } /// 是否是昨天 static bool isYesterdayByMs(int ms, int locMs) { return isYesterday(DateTime.fromMillisecondsSinceEpoch(ms), DateTime.fromMillisecondsSinceEpoch(locMs)); } /// 是否是本周 static bool isWeek(int? ms, {bool isUtc = false, int? locMs}) { if (ms == null || ms <= 0) { return false; } DateTime oldT = DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc); DateTime nowT; if (locMs != null) { nowT = TDateUtils.getDateTimeByMs(locMs, isUtc: isUtc); } else { nowT = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal(); } DateTime old = nowT.millisecondsSinceEpoch > oldT.millisecondsSinceEpoch ? oldT : nowT; DateTime now = nowT.millisecondsSinceEpoch > oldT.millisecondsSinceEpoch ? nowT : oldT; return (now.weekday >= old.weekday) && (now.millisecondsSinceEpoch - old.millisecondsSinceEpoch <= 7 * 24 * 60 * 60 * 1000); } /// 是否同年 static bool yearIsEqual(DateTime dateTime, DateTime locDateTime) { return dateTime.year == locDateTime.year; } /// 是否同年 static bool yearIsEqualByMs(int ms, int locMs) { return yearIsEqual(DateTime.fromMillisecondsSinceEpoch(ms), DateTime.fromMillisecondsSinceEpoch(locMs)); } /// 是否是闰年 static bool isLeapYear(DateTime dateTime) { return isLeapYearByYear(dateTime.year); } /// 是否是闰年 static bool isLeapYearByYear(int year) { return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; } /// 判断两个 DateTime 是否是同一天 static bool isSameDay(String date1, String date2) { final dateTime1 = getDateTime(date1); final dateTime2 = getDateTime(date2); if(dateTime1?.year == dateTime2?.year && dateTime1?.month == dateTime2?.month && dateTime1?.day == dateTime2?.day) { return true; } return false; } /// 如果如果当前月是12,下月年份需要+1 static int getNextMonthToYear() { DateTime dateTime = DateTime.now(); if(dateTime.month == 12) { return dateTime.year + 1; } return dateTime.year; } /// 获取当前下月 static int getNextMonth() { DateTime dateTime = DateTime.now(); if (dateTime.month == 12) { return 1; } return dateTime.month + 1; } static stringToYyMmDd(String date) { DateTime sourceDate = DateTime.parse(date); String formatDate = DateFormat("yyyy-MM-dd").format(sourceDate); return formatDate; } }