Skip to content

/// DateFormat.

enum DateFormat {
  DEFAULT, //yyyy-MM-dd HH:mm:ss.SSS
  NORMAL, //yyyy-MM-dd HH:mm:ss
  YEAR_MONTH_DAY_HOUR_MINUTE, //yyyy-MM-dd HH:mm
  YEAR_MONTH_DAY, //yyyy-MM-dd
  YEAR_MONTH, //yyyy-MM
  MONTH_DAY, //MM-dd
  MONTH_DAY_HOUR_MINUTE, //MM-dd HH:mm
  HOUR_MINUTE_SECOND, //HH:mm:ss
  HOUR_MINUTE, //HH:mm

  ZH_DEFAULT, //yyyy年MM月dd日 HH时mm分ss秒SSS毫秒
  ZH_NORMAL, //yyyy年MM月dd日 HH时mm分ss秒  /  timeSeparate: ":" --> yyyy年MM月dd日 HH:mm:ss
  ZH_YEAR_MONTH_DAY_HOUR_MINUTE, //yyyy年MM月dd日 HH时mm分  /  timeSeparate: ":" --> yyyy年MM月dd日 HH:mm
  ZH_YEAR_MONTH_DAY, //yyyy年MM月dd日
  ZH_YEAR_MONTH, //yyyy年MM月
  ZH_MONTH_DAY, //MM月dd日
  ZH_MONTH_DAY_HOUR_MINUTE, //MM月dd日 HH时mm分  /  timeSeparate: ":" --> MM月dd日 HH:mm
  ZH_HOUR_MINUTE_SECOND, //HH时mm分ss秒
  ZH_HOUR_MINUTE, //HH时mm分
}

/// 一些常用格式参照。可以自定义格式,例如:"yyyy/MM/dd HH:mm:ss","yyyy/M/d HH:mm:ss"。 /// 格式要求 /// year -> yyyy/yy month -> MM/M day -> dd/d /// hour -> HH/H minute -> mm/m second -> ss/s

class DataFormats {
  static String full = "yyyy-MM-dd HH:mm:ss";
  static String y_mo_d_h_m = "yyyy-MM-dd HH:mm";
  static String y_mo_d = "yyyy-MM-dd";
  static String y_mo = "yyyy-MM";
  static String mo_d = "MM-dd";
  static String mo_d_h_m = "MM-dd HH:mm";
  static String h_m_s = "HH:mm:ss";
  static String h_m = "HH:mm";

  static String zh_full = "yyyy年MM月dd日 HH时mm分ss秒";
  static String zh_y_mo_d_h_m = "yyyy年MM月dd日 HH时mm分";
  static String zh_y_mo_d = "yyyy年MM月dd日";
  static String zh_y_mo = "yyyy年MM月";
  static String zh_mo_d = "MM月dd日";
  static String zh_mo_d_h_m = "MM月dd日 HH时mm分";
  static String zh_h_m_s = "HH时mm分ss秒";
  static String zh_h_m = "HH时mm分";
}

/// month->days.

Map<int, int> MONTH_DAY = {
  1: 31,
  2: 28,
  3: 31,
  4: 30,
  5: 31,
  6: 30,
  7: 31,
  8: 31,
  9: 30,
  10: 31,
  11: 30,
  12: 31,
};

/// Date Util. class DateUtil { /// get DateTime By DateStr.

/// 通过字符串时间 获取 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;
  }

/// get DateTime By Milliseconds.

/// 通过 时间戳 获取 DateTime

  static DateTime getDateTimeByMs(int milliseconds, {bool isUtc = false}) {
    return DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: isUtc);
  }

/// get DateMilliseconds By DateStr.

/// 获取时间戳13位(单位 毫秒)

  static int? getDateMsByTimeStr(String dateStr) {
    DateTime? dateTime = DateTime.tryParse(dateStr);
    return dateTime?.millisecondsSinceEpoch;
  }

/// get Now Date Milliseconds.

/// 获取当前时间戳13位(单位 毫秒)

  static int getNowDateMs() {
    return DateTime.now().millisecondsSinceEpoch;
  }

/// get Now Date Str.(yyyy-MM-dd HH:mm:ss)

/// 获取当前 字符串时间 (yyyy-MM-dd HH:mm:ss)

  static String? getNowDateStr() {
    return getDateStrByDateTime(DateTime.now());
  }

/// get DateStr By DateStr. /// dateStr date String. /// format DateFormat type. /// dateSeparate date separate. /// timeSeparate time separate.

/// 通过字符串时间 格式化 字符串时间

  static String? getDateStrByTimeStr(
    String dateStr, {
    DateFormat format = DateFormat.NORMAL,
    String? dateSeparate,
    String? timeSeparate,
    bool? isUtc,
  }) {
    return getDateStrByDateTime(
      getDateTime(dateStr, isUtc: isUtc),
      format: format,
      dateSeparate: dateSeparate,
      timeSeparate: timeSeparate,
    );
  }

/// get DateStr By Milliseconds. /// milliseconds milliseconds. /// format DateFormat type. /// dateSeparate date separate. /// timeSeparate time separate.

/// 通过时间戳 获取 时间字符串(可格式化)

  static String? getDateStrByMs(
    int milliseconds, {
    DateFormat format = DateFormat.NORMAL,
    String? dateSeparate,
    String? timeSeparate,
    bool isUtc = false,
  }) {
    DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc);
    return getDateStrByDateTime(
      dateTime,
      format: format,
      dateSeparate: dateSeparate,
      timeSeparate: timeSeparate,
    );
  }

/// get DateStr By DateTime. /// dateTime dateTime. /// format DateFormat type. /// dateSeparate date separate. /// timeSeparate time separate.

/// 通过DateTime 获取 字符串时间 (可格式化)

static String? getDateStrByDateTime(
    DateTime? dateTime, {
    DateFormat format = DateFormat.NORMAL,
    String? dateSeparate,
    String? timeSeparate,
  }) {
    if (dateTime == null) return null;
    String dateStr = dateTime.toString();
    if (isZHFormat(format)) {
      dateStr = formatZHDateTime(dateStr, format, timeSeparate);
    } else {
      dateStr = formatDateTime(dateStr, format, dateSeparate, timeSeparate);
    }
    return dateStr;
  }

/// format ZH DateTime. /// time time string. /// format DateFormat type. ///timeSeparate time separate.

///获取中国时间 年月日

  static String formatZHDateTime(
    String time,
    DateFormat format,
    String? timeSeparate,
  ) {
    time = convertToZHDateTimeString(time, timeSeparate);
    switch (format) {
      case DateFormat.ZH_NORMAL: //yyyy年MM月dd日 HH时mm分ss秒
        time = time.substring(
            0,
            "yyyy年MM月dd日 HH时mm分ss秒".length -
                (timeSeparate == null || timeSeparate.isEmpty ? 0 : 1));
        break;
      case DateFormat.ZH_YEAR_MONTH_DAY_HOUR_MINUTE: //yyyy年MM月dd日 HH时mm分
        time = time.substring(
            0,
            "yyyy年MM月dd日 HH时mm分".length -
                (timeSeparate == null || timeSeparate.isEmpty ? 0 : 1));
        break;
      case DateFormat.ZH_YEAR_MONTH_DAY: //yyyy年MM月dd日
        time = time.substring(0, "yyyy年MM月dd日".length);
        break;
      case DateFormat.ZH_YEAR_MONTH: //yyyy年MM月
        time = time.substring(0, "yyyy年MM月".length);
        break;
      case DateFormat.ZH_MONTH_DAY: //MM月dd日
        time = time.substring("yyyy年".length, "yyyy年MM月dd日".length);
        break;
      case DateFormat.ZH_MONTH_DAY_HOUR_MINUTE: //MM月dd日 HH时mm分
        time = time.substring(
            "yyyy年".length,
            "yyyy年MM月dd日 HH时mm分".length -
                (timeSeparate == null || timeSeparate.isEmpty ? 0 : 1));
        break;
      case DateFormat.ZH_HOUR_MINUTE_SECOND: //HH时mm分ss秒
        time = time.substring(
            "yyyy年MM月dd日 ".length,
            "yyyy年MM月dd日 HH时mm分ss秒".length -
                (timeSeparate == null || timeSeparate.isEmpty ? 0 : 1));
        break;
      case DateFormat.ZH_HOUR_MINUTE: //HH时mm分
        time = time.substring(
            "yyyy年MM月dd日 ".length,
            "yyyy年MM月dd日 HH时mm分".length -
                (timeSeparate == null || timeSeparate.isEmpty ? 0 : 1));
        break;
      default:
        break;
    }
    return time;
  }
  static String formatTime(String time) {
    if (time == '') return '';
    DateTime d = DateTime.parse(time);
    int num_d = DateTime.parse(time).millisecondsSinceEpoch;
    int now = DateTime.now().millisecondsSinceEpoch;
    int diff = ((now - num_d) / 1000).truncate();
    if (diff < 30) {
      return '刚刚';
    } else if (diff < 3600) {
      // less 1 hour
      return "${(diff / 60).truncate()}分钟前";
    } else if (diff < 3600 * 24) {
      return "${(diff / 3600).truncate()}小时前";
    } else if (diff < 3600 * 24 * 2) {
      return '1天前';
    }
    return "${d.month}月${d.day}日 ${d.hour}:${d.second < 10 ? '0${d.second}' : d.second}";
  }
  static DateTime getDateTimeNowToZh() {
    return DateTime.fromMillisecondsSinceEpoch(
        DateTime.now().millisecondsSinceEpoch);
  }

/// format DateTime. /// time time string. /// format DateFormat type. /// dateSeparate date separate. /// timeSeparate time separate.

/// 格式化时间 参数字符串时间

  static String formatDateTime(
    String time,
    DateFormat format,
    String? dateSeparate,
    String? timeSeparate,
  ) {
    switch (format) {
      case DateFormat.NORMAL: //yyyy-MM-dd HH:mm:ss
        time = time.substring(0, "yyyy-MM-dd HH:mm:ss".length);
        break;
      case DateFormat.YEAR_MONTH_DAY_HOUR_MINUTE: //yyyy-MM-dd HH:mm
        time = time.substring(0, "yyyy-MM-dd HH:mm".length);
        break;
      case DateFormat.YEAR_MONTH_DAY: //yyyy-MM-dd
        time = time.substring(0, "yyyy-MM-dd".length);
        break;
      case DateFormat.YEAR_MONTH: //yyyy-MM
        time = time.substring(0, "yyyy-MM".length);
        break;
      case DateFormat.MONTH_DAY: //MM-dd
        time = time.substring("yyyy-".length, "yyyy-MM-dd".length);
        break;
      case DateFormat.MONTH_DAY_HOUR_MINUTE: //MM-dd HH:mm
        time = time.substring("yyyy-".length, "yyyy-MM-dd HH:mm".length);
        break;
      case DateFormat.HOUR_MINUTE_SECOND: //HH:mm:ss
        time =
            time.substring("yyyy-MM-dd ".length, "yyyy-MM-dd HH:mm:ss".length);
        break;
      case DateFormat.HOUR_MINUTE: //HH:mm
        time = time.substring("yyyy-MM-dd ".length, "yyyy-MM-dd HH:mm".length);
        break;
      default:
        break;
    }
    time = dateTimeSeparate(time, dateSeparate, timeSeparate);
    return time;
  }

/// is format to ZH DateTime String

/// 自定义格式化中国时间

  static bool isZHFormat(DateFormat format) {
    return format == DateFormat.ZH_DEFAULT ||
        format == DateFormat.ZH_NORMAL ||
        format == DateFormat.ZH_YEAR_MONTH_DAY_HOUR_MINUTE ||
        format == DateFormat.ZH_YEAR_MONTH_DAY ||
        format == DateFormat.ZH_YEAR_MONTH ||
        format == DateFormat.ZH_MONTH_DAY ||
        format == DateFormat.ZH_MONTH_DAY_HOUR_MINUTE ||
        format == DateFormat.ZH_HOUR_MINUTE_SECOND ||
        format == DateFormat.ZH_HOUR_MINUTE;
  }

/// convert To ZH DateTime String

  static String convertToZHDateTimeString(String time, String? timeSeparate) {
    time = time.replaceFirst("-", "年");
    time = time.replaceFirst("-", "月");
    time = time.replaceFirst(" ", "日 ");
    if (timeSeparate == null || timeSeparate.isEmpty) {
      time = time.replaceFirst(":", "时");
      time = time.replaceFirst(":", "分");
      time = time.replaceFirst(".", "秒");
      time = time + "毫秒";
    } else {
      time = time.replaceAll(":", timeSeparate);
    }
    return time;
  }

/// date Time Separate.

static String dateTimeSeparate(
    String time,
    String? dateSeparate,
    String? timeSeparate,
  ) {
    if (dateSeparate != null) {
      time = time.replaceAll("-", dateSeparate);
    }
    if (timeSeparate != null) {
      time = time.replaceAll(":", timeSeparate);
    }
    return time;
  }

/// format date by milliseconds.

/// milliseconds 日期毫秒

  static String formatDateMs(
    int milliseconds, {
    bool isUtc = false,
    String? format,
  }) {
    return formatDate(
      getDateTimeByMs(milliseconds, isUtc: isUtc),
      format: format,
    );
  }

/// format date by date str.

/// dateStr 日期字符串

  static String formatDateStr(String dateStr, {bool? isUtc, String? format}) {
    return formatDate(getDateTime(dateStr, isUtc: isUtc), format: format);
  }

/// format date by DateTime.

/// format 转换格式(已提供常用格式 DataFormats,可以自定义格式:"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 ?? DataFormats.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;

  }

/// com 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;
  }

/// get WeekDay By Milliseconds.

/// 英文版星期

  static String? getWeekDayByMs(int milliseconds, {bool isUtc = false}) {
    DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc);
    return getWeekDay(dateTime);
  }

/// get ZH WeekDay By Milliseconds.

/// 获取 通过 时间戳 获取 星期几

  static String? getZHWeekDayByMs(int milliseconds, {bool isUtc = false}) {
    DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc);
    return getZHWeekDay(dateTime);
  }

/// get WeekDay.

static String? getWeekDay(DateTime dateTime) {
    String? weekday;
    switch (dateTime.weekday) {
      case 1:
        weekday = "Monday";
        break;
      case 2:
        weekday = "Tuesday";
        break;
      case 3:
        weekday = "Wednesday";
        break;
      case 4:
        weekday = "Thursday";
        break;
      case 5:
        weekday = "Friday";
        break;
      case 6:
        weekday = "Saturday";
        break;
      case 7:
        weekday = "Sunday";
        break;
      default:
        break;
    }
    return weekday;
  }

/// get ZH WeekDay.

/// 返回星期几

 static String? getZHWeekDay(DateTime dateTime) {
    String? weekday;
    switch (dateTime.weekday) {
      case 1:
        weekday = "星期一";
        break;
      case 2:
        weekday = "星期二";
        break;
      case 3:
        weekday = "星期三";
        break;
      case 4:
        weekday = "星期四";
        break;
      case 5:
        weekday = "星期五";
        break;
      case 6:
        weekday = "星期六";
        break;
      case 7:
        weekday = "星期日";
        break;
      default:
        break;
    }
    return weekday;
  }

/// Return whether it is leap year.

/// 是否是闰年 传参 DateTime

static bool isLeapYearByDateTime(DateTime dateTime) {
    return isLeapYearByYear(dateTime.year);
  }

/// Return whether it is leap year.

/// 是否是闰年 传参 年

 static bool isLeapYearByYear(int year) {
    return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
  }

/// is yesterday by millis.

/// 是否是昨天.

  static bool isYesterdayByMillis(int millis, int locMillis) {
    return isYesterday(DateTime.fromMillisecondsSinceEpoch(millis),
        DateTime.fromMillisecondsSinceEpoch(locMillis));
  }

/// is yesterday by dateTime.

/// 是否是昨天.

  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);
    }
  }

/// get day of year.

/// 在今年的第几天.

  static int getDayOfYearByMillis(int millis, {bool isUtc = false}) {
    return getDayOfYear(
        DateTime.fromMillisecondsSinceEpoch(millis, isUtc: isUtc));
  }

/// get day of year.

/// 在今年的第几天.

  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 + (MONTH_DAY[i] ?? 0);
    }
    if (isLeapYearByYear(year) && month > 2) {
      days = days + 1;
    }
    return days;
  }

/// year is equal.

/// 是否同年.

 static bool yearIsEqualByMillis(int millis, int locMillis) {
    return yearIsEqual(DateTime.fromMillisecondsSinceEpoch(millis),
        DateTime.fromMillisecondsSinceEpoch(locMillis));
  }

  static bool isThisYear(int millis) {
    return yearIsEqual(
        DateTime.fromMillisecondsSinceEpoch(millis), DateTime.now());
  }

/// year is equal.

/// 是否同年.

  static bool yearIsEqual(DateTime dateTime, DateTime locDateTime) {
    return dateTime.year == locDateTime.year;
  }

/// is today.

/// 是否是当天.

  static bool isToday(int milliseconds, {bool isUtc = false}) {
    if (milliseconds == 0) return false;
    DateTime old =
        DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: isUtc);
    DateTime now = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal();
    return old.year == now.year && old.month == now.month && old.day == now.day;
  }

/// is Week.

/// 是否是本周.

  static bool isWeek(int milliseconds, {bool isUtc = false}) {
    if (milliseconds <= 0) {
      return false;
    }
    DateTime _old =
        DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: isUtc);
    DateTime _now = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal();
    DateTime old =
        _now.millisecondsSinceEpoch > _old.millisecondsSinceEpoch ? _old : _now;
    DateTime now =
        _now.millisecondsSinceEpoch > _old.millisecondsSinceEpoch ? _now : _old;
    return (now.weekday >= old.weekday) &&
        (now.millisecondsSinceEpoch - old.millisecondsSinceEpoch <=
            7 * 24 * 60 * 60 * 1000);
  }
  static String getChatTime(int nanosecond) {
    int milliseconds = nanosecond ~/ (1000 * 1000);
    if (isToday(milliseconds)) {
      return formatDateMs(milliseconds, format: DataFormats.h_m);
    } else if (isYesterdayByMillis(milliseconds, getNowDateMs())) {
      return 'Yesterday ${formatDateMs(milliseconds, format: DataFormats.h_m)}';
    } else if (yearIsEqualByMillis(milliseconds, getNowDateMs())) {
      return formatDateMs(milliseconds, format: 'MM/dd');
    } else {
      return formatDateMs(milliseconds, format: 'yyyy/MM/dd');
    }
  }

//获取一个月的最后一天是几号

static int getLastDay(DateTime date) {
    var dateMonth = date.month;
    var month = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    var fullYear = date.year;
    //判断二月份天数
    if (fullYear % 4 == 0 && (fullYear % 100 != 0 || fullYear % 400 == 0)) {
      daysInMonth[1] = 29;
    }
    var lastDay = daysInMonth[month.indexOf(dateMonth)];
    return lastDay;
  }

//时区 加8小时

  static String getDateTimeZoom(String? date) {
    if (date == null) return '';
    int time = getDateMsByTimeStr(date) ?? 0;
    if (time == 0) {
      return '';
    } else {
      time = time + (8 * 3600);
      var dateTime = getDateStrByMs(time);

  return dateTime ?? '';
}

  }
}

Lucking