369 lines
13 KiB
Dart
369 lines
13 KiB
Dart
|
|
import 'package:flustars_flutter3/flustars_flutter3.dart';
|
|||
|
|
|
|||
|
|
enum DateTimeUtilsType {
|
|||
|
|
yearMonthDayHourMinuteSecond, // 2024-01-01 01:01:01
|
|||
|
|
yearMonthDayHourMinute, // 2024-01-01 01:01
|
|||
|
|
yearMonthDay, // 2024-01-01
|
|||
|
|
monthDay, //01-01
|
|||
|
|
monthDayPoint, //01.01
|
|||
|
|
monthDayWord, //01月01日
|
|||
|
|
yearMonthDayPoint, // 2024.01.01
|
|||
|
|
yearMonthDayHourMinutePoint, // 2024.01.01
|
|||
|
|
yearMonthDayHourMinuteSecondPoint, // 2024.01.01 01:01:01
|
|||
|
|
yearMonthDayWord, // 2024年01月01日
|
|||
|
|
yearMonthWord, // 2024年01月
|
|||
|
|
yearMonth, // 2024-01
|
|||
|
|
yearMonthPoint, // 2024.01
|
|||
|
|
hourMinuteSecond, // 01:01:01
|
|||
|
|
hourMinute, // 01:01
|
|||
|
|
monthDayLine, // 01:01
|
|||
|
|
monthWord, //01月
|
|||
|
|
monthDayHourMinutePoint, //01月
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///日期处理类
|
|||
|
|
class DateTimeUtils {
|
|||
|
|
static String dateTimeUtilsTool({
|
|||
|
|
DateTimeUtilsType? dateTimeUtilsType,
|
|||
|
|
String? dateTime,
|
|||
|
|
String nullString = '-- --',
|
|||
|
|
}) {
|
|||
|
|
if (dateTime == null || dateTime == '') return nullString;
|
|||
|
|
DateTime date = DateTime.parse(dateTime).toLocal();
|
|||
|
|
switch (dateTimeUtilsType) {
|
|||
|
|
case null:
|
|||
|
|
return nullString;
|
|||
|
|
case DateTimeUtilsType.yearMonthDayHourMinuteSecond:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'-${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'-${date.day.toString().padLeft(2, '0')}'
|
|||
|
|
' ${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.second.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.yearMonthDayHourMinute:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'-${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'-${date.day.toString().padLeft(2, '0')}'
|
|||
|
|
' ${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.yearMonthDay:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'-${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'-${date.day.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.monthDay:
|
|||
|
|
return '${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'-${date.day.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.monthDayPoint:
|
|||
|
|
return '${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'.${date.day.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.monthDayWord:
|
|||
|
|
return '${date.month.toString().padLeft(2, '0')}月'
|
|||
|
|
'${date.day.toString().padLeft(2, '0')}日';
|
|||
|
|
case DateTimeUtilsType.yearMonthDayPoint:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'.${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'.${date.day.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.yearMonthDayHourMinuteSecondPoint:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'.${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'.${date.day.toString().padLeft(2, '0')}'
|
|||
|
|
' ${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.second.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.yearMonthDayHourMinutePoint:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'.${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'.${date.day.toString().padLeft(2, '0')}'
|
|||
|
|
' ${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.yearMonthDayWord:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'年${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'月${date.day.toString().padLeft(2, '0')}日';
|
|||
|
|
case DateTimeUtilsType.yearMonthWord:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'年${date.month.toString().padLeft(2, '0')}月';
|
|||
|
|
case DateTimeUtilsType.yearMonth:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'-${date.month.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.yearMonthPoint:
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'.${date.month.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.hourMinuteSecond:
|
|||
|
|
return '${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.second.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.hourMinute:
|
|||
|
|
return '${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.monthDayLine:
|
|||
|
|
return '${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'/${date.day.toString().padLeft(2, '0')}';
|
|||
|
|
case DateTimeUtilsType.monthWord:
|
|||
|
|
return '${date.month.toString().padLeft(2, '0')}月';
|
|||
|
|
case DateTimeUtilsType.monthDayHourMinutePoint:
|
|||
|
|
return '${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'.${date.day.toString().padLeft(2, '0')}'
|
|||
|
|
' ${date.hour.toString().padLeft(2, '0')}'
|
|||
|
|
':${date.minute.toString().padLeft(2, '0')}';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 计算两个日期相差多少天?
|
|||
|
|
static int differenceTwoTimes({
|
|||
|
|
String? startTime,
|
|||
|
|
String? endTime,
|
|||
|
|
}) {
|
|||
|
|
var startDate =
|
|||
|
|
startTime == null ? DateTime.now() : DateTime.parse(startTime);
|
|||
|
|
var endDate = endTime == null ? DateTime.now() : DateTime.parse(endTime);
|
|||
|
|
var days = endDate.difference(startDate).inDays;
|
|||
|
|
return days;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 计算两个日期相差inMinutes?
|
|||
|
|
static int differenceTwoInMinutesTimes({
|
|||
|
|
String? startTime,
|
|||
|
|
String? endTime,
|
|||
|
|
}) {
|
|||
|
|
var startDate =
|
|||
|
|
startTime == null ? DateTime.now() : DateTime.parse(startTime);
|
|||
|
|
var endDate = endTime == null ? DateTime.now() : DateTime.parse(endTime);
|
|||
|
|
var days = endDate.difference(startDate).inMinutes;
|
|||
|
|
return days;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// 计算两个日期相差day huor min?
|
|||
|
|
static String differenceTwoDayHourTimes({
|
|||
|
|
String? startTime,
|
|||
|
|
String? endTime,
|
|||
|
|
|
|||
|
|
}) {
|
|||
|
|
|
|||
|
|
String xxxxx = '0';
|
|||
|
|
var startDate =
|
|||
|
|
startTime == null ? DateTime.now() : DateTime.parse(startTime);
|
|||
|
|
var endDate = endTime == null ? DateTime.now() : DateTime.parse(endTime);
|
|||
|
|
var days = endDate.difference(startDate).inDays;
|
|||
|
|
if(days == 0){
|
|||
|
|
//days == 0 相当
|
|||
|
|
var hours = endDate.difference(startDate).inHours;
|
|||
|
|
|
|||
|
|
if(hours == 0){
|
|||
|
|
var minutes = endDate.difference(startDate).inMinutes;
|
|||
|
|
xxxxx = '$minutes分';
|
|||
|
|
}else{
|
|||
|
|
// xxxxx = hours;
|
|||
|
|
var minutes = endDate.difference(startDate).inMinutes;
|
|||
|
|
|
|||
|
|
xxxxx = '${minutes ~/ 60}小时${minutes % 60}分';
|
|||
|
|
}
|
|||
|
|
}else{
|
|||
|
|
// xxxxx = days;
|
|||
|
|
var hours = endDate.difference(startDate).inHours;
|
|||
|
|
int divisor = 24; // 除数
|
|||
|
|
int quotient = hours ~/ divisor; // 取整除法,得到商
|
|||
|
|
int remainder = hours % divisor; // 取余数,得到余数
|
|||
|
|
//
|
|||
|
|
// print('商: $quotient');
|
|||
|
|
// print('余数: $remainder');
|
|||
|
|
xxxxx = '$quotient天$remainder小时';
|
|||
|
|
}
|
|||
|
|
return xxxxx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
///获取当前月份
|
|||
|
|
static String getCurrentMonth() {
|
|||
|
|
DateTime date = DateTime.now();
|
|||
|
|
return date.month.toString().padLeft(2, '0');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///获取当前的年月日
|
|||
|
|
static String getCurrentYMD() {
|
|||
|
|
DateTime date = DateTime.now();
|
|||
|
|
return '${date.year.toString()}'
|
|||
|
|
'-${date.month.toString().padLeft(2, '0')}'
|
|||
|
|
'-${date.day.toString().padLeft(2, '0')}';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///判断时间是否在某个时间区间内
|
|||
|
|
static bool isTimeInRange({
|
|||
|
|
required DateTime startTime,
|
|||
|
|
required DateTime endTime,
|
|||
|
|
required DateTime dateTime,
|
|||
|
|
}) {
|
|||
|
|
return dateTime.isAfter(startTime) && dateTime.isBefore(endTime);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///获取当月份
|
|||
|
|
static String get getMonth {
|
|||
|
|
return DateTime.now().month.toString();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///获取当年份
|
|||
|
|
static String get getYear {
|
|||
|
|
return DateTime.now().year.toString();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///获取当年份
|
|||
|
|
static String getGMTString() {
|
|||
|
|
|
|||
|
|
return DateTime.now().year.toString();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///获取当前属于第几周
|
|||
|
|
static String getWeekDay(DateTime dateTime) {
|
|||
|
|
List<String> weekday = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
|
|||
|
|
return weekday[dateTime.weekday - 1];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///根据日期获取某月的第一天和最后一天
|
|||
|
|
static Map<String, dynamic> getMonthStartAndMonthEnd(
|
|||
|
|
{required DateTime dateTime}) {
|
|||
|
|
DateTime monthStart = DateTime(
|
|||
|
|
dateTime.year,
|
|||
|
|
dateTime.month,
|
|||
|
|
1,
|
|||
|
|
); // 获取本月第一天的日期时间
|
|||
|
|
DateTime monthEnd = DateTime(
|
|||
|
|
dateTime.year,
|
|||
|
|
dateTime.month + 1,
|
|||
|
|
0,
|
|||
|
|
23,
|
|||
|
|
59,
|
|||
|
|
59,
|
|||
|
|
); // 获取本月最后一天的日期时间(时间为23:59:59)
|
|||
|
|
return {
|
|||
|
|
'monthStart': monthStart,
|
|||
|
|
'monthEnd': monthEnd,
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
// DateTime monthStart = DateTime(
|
|||
|
|
// int.parse(time.toString().split('-').first),
|
|||
|
|
// int.parse(time.toString().split('-').last),
|
|||
|
|
// 1); // 获取本月第一天的日期时间
|
|||
|
|
// DateTime monthEnd = DateTime(
|
|||
|
|
// int.parse(time.toString().split('-').first),
|
|||
|
|
// int.parse(time.toString().split('-').last) + 1,
|
|||
|
|
// 0,
|
|||
|
|
// 23,
|
|||
|
|
// 59,
|
|||
|
|
// 59); // 获取本月最后一天的日期时间(时间为23:59:59)
|
|||
|
|
/// /
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class TimeMachineUtil {
|
|||
|
|
/// 获取某一年的第一个月的第一天和最后一个月的最后一天
|
|||
|
|
static getStartEndYearDate(int iYear) {
|
|||
|
|
Map mapDate = {};
|
|||
|
|
int yearNow = DateTime.now().year;
|
|||
|
|
yearNow = yearNow + iYear;
|
|||
|
|
|
|||
|
|
String newStartYear = '$yearNow-01-01';
|
|||
|
|
String newEndtYear = '${yearNow + 1}-01-00';
|
|||
|
|
|
|||
|
|
mapDate['startTime'] = DateUtil.formatDate(
|
|||
|
|
DateTime.fromMillisecondsSinceEpoch(turnTimestamp(newStartYear)),
|
|||
|
|
format: 'yyyy-MM-dd');
|
|||
|
|
mapDate['endTime'] = DateUtil.formatDate(
|
|||
|
|
DateTime.fromMillisecondsSinceEpoch(turnTimestamp(newEndtYear)),
|
|||
|
|
format: 'yyyy-MM-dd');
|
|||
|
|
|
|||
|
|
mapDate['startStamp'] = turnTimestamp(mapDate['startTime'] + ' 00:00:00');
|
|||
|
|
mapDate['endStamp'] = turnTimestamp(mapDate['endTime'] + ' 23:59:59');
|
|||
|
|
print('某一年初和年末:$mapDate');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 获得当前日期 未来/过去 第某个月第一天和最后一天时间
|
|||
|
|
static Map<String, String> getMonthDate(int iMonth) {
|
|||
|
|
//获取当前日期
|
|||
|
|
var currentDate = DateTime.now();
|
|||
|
|
if (iMonth + currentDate.month > 0) {
|
|||
|
|
return timeConversion(
|
|||
|
|
iMonth + currentDate.month, (currentDate.year).toString());
|
|||
|
|
} else {
|
|||
|
|
int beforeYear = (iMonth + currentDate.month) ~/ 12;
|
|||
|
|
String yearNew = (currentDate.year + beforeYear - 1).toString();
|
|||
|
|
int monthNew = (iMonth + currentDate.month) - beforeYear * 12;
|
|||
|
|
return timeConversion(12 + monthNew, yearNew);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static Map<String, String> timeConversion(int monthTime, String yearTime) {
|
|||
|
|
Map<String, String> dateMap = {};
|
|||
|
|
dateMap['startDate'] =
|
|||
|
|
'$yearTime-${monthTime < 10 ? '0$monthTime' : '$monthTime'}-01';
|
|||
|
|
//转时间戳再转时间格式 防止出错
|
|||
|
|
dateMap['startDate'] = DateUtil.formatDate(
|
|||
|
|
DateTime.fromMillisecondsSinceEpoch(
|
|||
|
|
turnTimestamp(dateMap['startDate'] ?? "")),
|
|||
|
|
format: 'yyyy-MM-dd');
|
|||
|
|
//某个月结束时间,转时间戳再转
|
|||
|
|
String endMonth =
|
|||
|
|
'$yearTime-${(monthTime + 1) < 10 ? '0${monthTime + 1}' : (monthTime + 1)}-00';
|
|||
|
|
var endMonthTimeStamp = turnTimestamp(endMonth);
|
|||
|
|
endMonth = DateUtil.formatDate(
|
|||
|
|
DateTime.fromMillisecondsSinceEpoch(endMonthTimeStamp),
|
|||
|
|
format: 'yyyy-MM-dd');
|
|||
|
|
dateMap['endDate'] = endMonth;
|
|||
|
|
//这里是为了公司后台接口 需加时间段的时间戳 但不显示在格式化实践中
|
|||
|
|
dateMap['startDateStamp'] =
|
|||
|
|
turnTimestamp('${dateMap['startDate']} 00:00:00').toString();
|
|||
|
|
dateMap['endDateStamp'] =
|
|||
|
|
turnTimestamp('${dateMap['endDate']} 23:59:59').toString();
|
|||
|
|
// print('过去未来某个月初月末:$dateMap');
|
|||
|
|
return dateMap;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 转时间戳
|
|||
|
|
static int turnTimestamp(String timestamp) {
|
|||
|
|
return DateTime.parse(timestamp).millisecondsSinceEpoch;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 当前时间 过去/未来 某个周的周一和周日
|
|||
|
|
static Map<String, String> getWeeksDate(int weeks) {
|
|||
|
|
Map<String, String> mapTime = {};
|
|||
|
|
DateTime now = DateTime.now();
|
|||
|
|
int weekday = now.weekday; //今天周几
|
|||
|
|
|
|||
|
|
var sunDay = getTimestampLatest(false, 7 - weekday + weeks * 7); //周末
|
|||
|
|
var monDay = getTimestampLatest(true, -weekday + 1 + weeks * 7); //周一
|
|||
|
|
|
|||
|
|
mapTime['monDay'] = DateUtil.formatDate(
|
|||
|
|
DateTime.fromMillisecondsSinceEpoch(monDay),
|
|||
|
|
format: 'yyyy-MM-dd'); //周一 时间格式化
|
|||
|
|
mapTime['sunDay'] = DateUtil.formatDate(
|
|||
|
|
DateTime.fromMillisecondsSinceEpoch(sunDay),
|
|||
|
|
format: 'yyyy-MM-dd'); //周一 时间格式化
|
|||
|
|
mapTime['monDayStamp'] = '$monDay'; //周一 时间戳
|
|||
|
|
mapTime['sunDayStamp'] = '$sunDay'; //周日 时间戳
|
|||
|
|
// print('某个周的周一和周日:$mapTime');
|
|||
|
|
return mapTime;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// phase : 是零点还是23:59:59
|
|||
|
|
static int getTimestampLatest(bool phase, int day) {
|
|||
|
|
String newHours;
|
|||
|
|
DateTime now = DateTime.now();
|
|||
|
|
DateTime sixtyDaysFromNow = now.add(Duration(days: day));
|
|||
|
|
String formattedDate =
|
|||
|
|
DateUtil.formatDate(sixtyDaysFromNow, format: 'yyyy-MM-dd');
|
|||
|
|
if (phase) {
|
|||
|
|
newHours = '$formattedDate 00:00:00';
|
|||
|
|
} else {
|
|||
|
|
newHours = '$formattedDate 23:59:59';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DateTime newDate = DateTime.parse(newHours);
|
|||
|
|
// String newFormattedDate =
|
|||
|
|
// DateUtil.formatDate(newDate, format: 'yyyy-MM-dd HH:mm:ss');
|
|||
|
|
int timeStamp = newDate.millisecondsSinceEpoch;
|
|||
|
|
// print('时间' + newFormattedDate);
|
|||
|
|
return timeStamp;
|
|||
|
|
}
|
|||
|
|
}
|