-
Notifications
You must be signed in to change notification settings - Fork 115
/
locale.dart
84 lines (73 loc) · 2.56 KB
/
locale.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
import '../enums/startOfWeek.dart';
import '../enums/units.dart';
import 'relative_date_time.dart';
abstract class Locale {
String code();
List<String> ordinals();
StartOfWeek startOfWeek();
RelativeDateTime relativeDateTime();
String getRelativeTime(
DateTime date1, {
DateTime? date2,
Units? maxRelativeTimeUnit =
Units.YEAR, // ONLY SUPPORT MINUTE, HOUR, DAY, MONTH, YEAR
}) {
final relative = relativeDateTime();
final _date2 = date2 ?? DateTime.now();
final _allowFromNow = _date2.isBefore(date1);
var elapsed = _date2.millisecondsSinceEpoch - date1.millisecondsSinceEpoch;
String prefix, suffix;
if (_allowFromNow && elapsed < 0) {
elapsed = date1.isBefore(_date2) ? elapsed : elapsed.abs();
prefix = relative.prefixFromNow();
suffix = relative.suffixFromNow();
} else {
prefix = relative.prefixAgo();
suffix = relative.suffixAgo();
}
final num seconds = elapsed / 1000;
final num minutes = seconds / 60;
final num hours = minutes / 60;
final num days = hours / 24;
final num months = days / 30;
final num years = days / 365;
String result;
if (seconds < 45) {
result = relative.lessThanOneMinute(seconds.round());
} else if (seconds < 90) {
result = relative.aboutAMinute(minutes.round());
} else if (minutes < 45 ||
(minutes >= 45 && maxRelativeTimeUnit == Units.MINUTE)) {
result = relative.minutes(minutes.round());
} else if (minutes < 90) {
result = relative.aboutAnHour(minutes.round());
} else if (hours < 24 ||
(hours >= 24 && maxRelativeTimeUnit == Units.HOUR)) {
result = relative.hours(hours.round());
} else if (hours < 48) {
result = relative.aDay(hours.round());
} else if (days < 30 || (days >= 30 && maxRelativeTimeUnit == Units.DAY)) {
result = relative.days(days.round());
} else if (days < 60) {
result = relative.aboutAMonth(days.round());
} else if (days < 365 ||
(days >= 365 && maxRelativeTimeUnit == Units.MONTH)) {
result = relative.months(months.round());
} else if (years < 2) {
result = relative.aboutAYear(months.round());
} else {
result = relative.years(years.round());
}
return [prefix, result, suffix]
.where((str) => str.isNotEmpty)
.join(relative.wordSeparator());
}
String ordinal(int day) {
var suffix = ordinals().last;
var digit = day % 10;
if ((digit > 0 && digit < 4) && (day < 11 || day > 13)) {
suffix = ordinals()[digit - 1];
}
return suffix;
}
}