-
-
Notifications
You must be signed in to change notification settings - Fork 261
/
date_util.dart
289 lines (262 loc) · 8.71 KB
/
date_util.dart
1
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
/**
* @Author: Sky24n
* @GitHub: https://github.com/Sky24n
* @Description: Date Util.
* @Date: 2018/9/8
*/
/// 一些常用格式参照。可以自定义格式,例如:'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 DateFormats {
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.
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.
static DateTime getDateTimeByMs(int ms, {bool isUtc = false}) {
return DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc);
}
/// get DateMilliseconds By DateStr.
static int? getDateMsByTimeStr(String dateStr, {bool? isUtc}) {
DateTime? dateTime = getDateTime(dateStr, isUtc: isUtc);
return dateTime?.millisecondsSinceEpoch;
}
/// get Now Date Milliseconds.
static int getNowDateMs() {
return DateTime.now().millisecondsSinceEpoch;
}
/// get Now Date Str.(yyyy-MM-dd HH:mm:ss)
static String getNowDateStr() {
return formatDate(DateTime.now());
}
/// format date by milliseconds.
/// milliseconds 日期毫秒
static String formatDateMs(int ms, {bool isUtc = false, String? format}) {
return formatDate(getDateTimeByMs(ms, 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 转换格式(已提供常用格式 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;
}
/// 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.
/// dateTime
/// isUtc
/// languageCode zh or en
/// short
static String getWeekday(DateTime? dateTime,
{String languageCode = 'en', 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);
}
/// get WeekDay By Milliseconds.
static String getWeekdayByMs(int milliseconds,
{bool isUtc = false, String languageCode = 'en', bool short = false}) {
DateTime dateTime = getDateTimeByMs(milliseconds, isUtc: isUtc);
return getWeekday(dateTime, languageCode: languageCode, short: short);
}
/// 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]!;
}
if (isLeapYearByYear(year) && month > 2) {
days = days + 1;
}
return days;
}
/// get day of year.
/// 在今年的第几天.
static int getDayOfYearByMs(int ms, {bool isUtc = false}) {
return getDayOfYear(DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc));
}
/// is today.
/// 是否是当天.
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 = DateUtil.getDateTimeByMs(locMs);
} else {
now = isUtc ? DateTime.now().toUtc() : DateTime.now().toLocal();
}
return old.year == now.year && old.month == now.month && old.day == now.day;
}
/// 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);
}
}
/// is yesterday by millis.
/// 是否是昨天.
static bool isYesterdayByMs(int ms, int locMs) {
return isYesterday(DateTime.fromMillisecondsSinceEpoch(ms),
DateTime.fromMillisecondsSinceEpoch(locMs));
}
/// is Week.
/// 是否是本周.
static bool isWeek(int? ms, {bool isUtc = false, int? locMs}) {
if (ms == null || ms <= 0) {
return false;
}
DateTime _old = DateTime.fromMillisecondsSinceEpoch(ms, isUtc: isUtc);
DateTime _now;
if (locMs != null) {
_now = DateUtil.getDateTimeByMs(locMs, isUtc: isUtc);
} else {
_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);
}
/// year is equal.
/// 是否同年.
static bool yearIsEqual(DateTime dateTime, DateTime locDateTime) {
return dateTime.year == locDateTime.year;
}
/// year is equal.
/// 是否同年.
static bool yearIsEqualByMs(int ms, int locMs) {
return yearIsEqual(DateTime.fromMillisecondsSinceEpoch(ms),
DateTime.fromMillisecondsSinceEpoch(locMs));
}
/// Return whether it is leap year.
/// 是否是闰年
static bool isLeapYear(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;
}
}