时间 DateTime
# /// 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分
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// 一些常用格式参照。可以自定义格式,例如:"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分";
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// 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,
};
2
3
4
5
6
7
8
9
10
11
12
13
14
/// 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;
}
2
3
4
5
6
7
8
9
10
11
/// get DateTime By Milliseconds.
# /// 通过 时间戳 获取 DateTime
static DateTime getDateTimeByMs(int milliseconds, {bool isUtc = false}) {
return DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: isUtc);
}
2
3
/// get DateMilliseconds By DateStr.
# /// 获取时间戳13位(单位 毫秒)
static int? getDateMsByTimeStr(String dateStr) {
DateTime? dateTime = DateTime.tryParse(dateStr);
return dateTime?.millisecondsSinceEpoch;
}
2
3
4
/// get Now Date Milliseconds.
# /// 获取当前时间戳13位(单位 毫秒)
static int getNowDateMs() {
return DateTime.now().millisecondsSinceEpoch;
}
2
3
/// get Now Date Str.(yyyy-MM-dd HH:mm:ss)
# /// 获取当前 字符串时间 (yyyy-MM-dd HH:mm:ss)
static String? getNowDateStr() {
return getDateStrByDateTime(DateTime.now());
}
2
3
/// 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,
);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
/// 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,
);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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}";
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static DateTime getDateTimeNowToZh() {
return DateTime.fromMillisecondsSinceEpoch(
DateTime.now().millisecondsSinceEpoch);
}
2
3
4
/// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// 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;
}
2
3
4
5
6
7
8
9
10
11
# /// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# /// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
/// format date by milliseconds.
# /// milliseconds 日期毫秒
static String formatDateMs(
int milliseconds, {
bool isUtc = false,
String? format,
}) {
return formatDate(
getDateTimeByMs(milliseconds, isUtc: isUtc),
format: format,
);
}
2
3
4
5
6
7
8
9
10
/// format date by date str.
# /// dateStr 日期字符串
static String formatDateStr(String dateStr, {bool? isUtc, String? format}) {
return formatDate(getDateTime(dateStr, isUtc: isUtc), format: format);
}
2
3
# /// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# /// 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;
}
2
3
4
5
6
7
8
9
10
11
12
/// get WeekDay By Milliseconds.
# /// 英文版星期
static String? getWeekDayByMs(int milliseconds, {bool isUtc = false}) {
DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc);
return getWeekDay(dateTime);
}
2
3
4
/// get ZH WeekDay By Milliseconds.
# /// 获取 通过 时间戳 获取 星期几
static String? getZHWeekDayByMs(int milliseconds, {bool isUtc = false}) {
DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc);
return getZHWeekDay(dateTime);
}
2
3
4
# /// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// 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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// Return whether it is leap year.
# /// 是否是闰年 传参 DateTime
static bool isLeapYearByDateTime(DateTime dateTime) {
return isLeapYearByYear(dateTime.year);
}
2
3
/// Return whether it is leap year.
# /// 是否是闰年 传参 年
static bool isLeapYearByYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
2
3
/// is yesterday by millis.
# /// 是否是昨天.
static bool isYesterdayByMillis(int millis, int locMillis) {
return isYesterday(DateTime.fromMillisecondsSinceEpoch(millis),
DateTime.fromMillisecondsSinceEpoch(locMillis));
}
2
3
4
/// 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);
}
}
2
3
4
5
6
7
8
9
10
11
12
/// get day of year.
# /// 在今年的第几天.
static int getDayOfYearByMillis(int millis, {bool isUtc = false}) {
return getDayOfYear(
DateTime.fromMillisecondsSinceEpoch(millis, isUtc: isUtc));
}
2
3
4
/// 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;
}
2
3
4
5
6
7
8
9
10
11
12
/// 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());
}
2
3
4
5
6
7
8
9
/// year is equal.
# /// 是否同年.
static bool yearIsEqual(DateTime dateTime, DateTime locDateTime) {
return dateTime.year == locDateTime.year;
}
2
3
/// 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;
}
2
3
4
5
6
7
/// 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);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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');
}
}
2
3
4
5
6
7
8
9
10
11
12
# //获取一个月的最后一天是几号
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;
}
2
3
4
5
6
7
8
9
10
11
12
# //时区 加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 ?? '';
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14