Skip to content

Commit 5d8259d

Browse files
committed
Merge branch 'master' into release
2 parents 2ef09c6 + 0e6aa1b commit 5d8259d

File tree

4 files changed

+77
-4
lines changed

4 files changed

+77
-4
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.1.0
2+
3+
- Fixed `LocalWeekTimeRange` and `IsoWeekTimeRange`'s `to` being 1 microsecond ahead
4+
- Now you can parse/serialize `TimeRange` by calling `TimeRange.parse()` and `TimeRange.toString()`
5+
16
## 2.0.2
27

38
- Expose `PageableRange`

lib/src/time_range.dart

+69-1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,74 @@ abstract class TimeRange {
130130
@override
131131
int get hashCode => Object.hash(from, to, isUtc);
132132

133+
/// You can reconstruct [this] by passing the return value to
134+
/// [TimeRange.parse].
135+
///
136+
/// Serializes [DateTime] to ISO 8601 string, therefore preserves
137+
/// [from] and [to]'s timezone information.
133138
@override
134-
String toString() => "TimeRange($from -> $to)";
139+
String toString() {
140+
if (this is HourTimeRange) {
141+
return "HourTimeRange:${from.toIso8601String()}";
142+
}
143+
if (this is DayTimeRange) {
144+
return "DayTimeRange:${from.toIso8601String()}";
145+
}
146+
if (this is LocalWeekTimeRange) {
147+
return "LocalWeekTimeRange:${from.toIso8601String()}";
148+
}
149+
if (this is MonthTimeRange) {
150+
return "MonthTimeRange:${from.toIso8601String()}";
151+
}
152+
if (this is YearTimeRange) {
153+
return "YearTimeRange:${from.toIso8601String()}";
154+
}
155+
156+
return "CustomTimeRange:${from.toIso8601String()}:${to.toIso8601String()}";
157+
}
158+
159+
/// Parses string generated by [toString]
160+
///
161+
/// Throws [FormatException] if the string is not in the correct format
162+
static TimeRange parse(String serialized) {
163+
final TimeRange? result = tryParse(serialized);
164+
165+
if (result == null) {
166+
throw const FormatException(
167+
"Cannot parse TimeRange from serialized string",
168+
);
169+
}
170+
171+
return result;
172+
}
173+
174+
/// Parses string generated by [toString]
175+
///
176+
/// Returns null in any case of failure
177+
static TimeRange? tryParse(String serialized) {
178+
final List<String> parts = serialized.split(":");
179+
180+
if (parts.length < 2) return null;
181+
182+
final DateTime? from = DateTime.tryParse(parts[1]);
183+
final DateTime? to = parts.length > 2 ? DateTime.tryParse(parts[2]) : null;
184+
185+
if (from == null) return null;
186+
if (parts.first == "CustomTimeRange" && to == null) return null;
187+
188+
switch (parts[0]) {
189+
case "HourTimeRange":
190+
return HourTimeRange.fromDateTime(from);
191+
case "DayTimeRange":
192+
return DayTimeRange.fromDateTime(from);
193+
case "LocalWeekTimeRange":
194+
return LocalWeekTimeRange(from);
195+
case "MonthTimeRange":
196+
return MonthTimeRange.fromDateTime(from);
197+
case "YearTimeRange":
198+
return YearTimeRange.fromDateTime(from);
199+
default:
200+
return CustomTimeRange(from, to!);
201+
}
202+
}
135203
}

lib/src/time_range/week.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class LocalWeekTimeRange extends CustomTimeRange
99
LocalWeekTimeRange(DateTime dateTime, [this.weekStart])
1010
: super(
1111
dateTime.startOfLocalWeek(weekStart),
12-
dateTime.startOfNextLocalWeek(weekStart),
12+
dateTime.endOfLocalWeek(weekStart),
1313
);
1414

1515
@override
@@ -28,7 +28,7 @@ class LocalWeekTimeRange extends CustomTimeRange
2828
class IsoWeekTimeRange extends CustomTimeRange
2929
with PageableRange<IsoWeekTimeRange> {
3030
IsoWeekTimeRange(DateTime dateTime)
31-
: super(dateTime.startOfLocalWeek(1), dateTime.startOfNextLocalWeek(1));
31+
: super(dateTime.startOfLocalWeek(1), dateTime.endOfLocalWeek(1));
3232

3333
int get weekYear => from.weekYear;
3434
int get week => from.week;

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: moment_dart
22
description: Multi-purpose immutable DateTime subclass. Supports multiple localizations to easily convert DateTime and Duration into human-readable format
3-
version: 2.0.2
3+
version: 2.1.0
44
homepage: https://github.com/sadespresso/moment_dart
55
issue_tracker: https://github.com/sadespresso/moment_dart/issues
66
funding:

0 commit comments

Comments
 (0)