diff --git a/lib/utils/datetime.dart b/lib/utils/datetime.dart index bd028d1c..ab776843 100644 --- a/lib/utils/datetime.dart +++ b/lib/utils/datetime.dart @@ -1,21 +1,22 @@ +import 'dart:core'; import 'package:intl/intl.dart'; String toIso8601(DateTime dt) { return DateFormat("yyyy-MM-ddTHH:mm:ss").format(dt); } -String toIso8601WithTimezone(DateTime dt) { +String toIso8601WithTimezone(DateTime dt, [Duration offset]) { var result = DateFormat("yyyy-MM-ddTHH:mm:ss").format(dt); - var offset = dt.timeZoneOffset; + offset = offset ?? dt.timeZoneOffset; int minutes = (offset.inMinutes % 60); int hours = offset.inHours.toInt(); - String minutesStr; - if (minutes < 10) { - minutesStr = '0' + minutes.toString(); - } else { - minutesStr = minutes.toString(); + String sign = '+'; + if (hours < 0) { + hours = hours < 0 ? hours * -1 : hours; + minutes = minutes < 0 ? minutes * -1 : minutes; + sign = '-'; } String hourStr; @@ -25,5 +26,12 @@ String toIso8601WithTimezone(DateTime dt) { hourStr = hours.toString(); } - return result + '+' + hourStr + ':' + minutesStr; + String minutesStr; + if (minutes < 10) { + minutesStr = '0' + minutes.toString(); + } else { + minutesStr = minutes.toString(); + } + + return result + sign + hourStr + ':' + minutesStr; } diff --git a/test/datetime_utils_test.dart b/test/datetime_utils_test.dart index 64f2542e..ab8dad71 100644 --- a/test/datetime_utils_test.dart +++ b/test/datetime_utils_test.dart @@ -16,5 +16,34 @@ void main() { expect(str, "2011-06-06T05:05:03+00:00"); }); + + test('Test with positive offset', () { + var dateTime = DateTime.utc(2011, 6, 6, 5, 5, 3); + var str = toIso8601WithTimezone(dateTime, Duration(hours: 2)); + + expect(str, "2011-06-06T05:05:03+02:00"); + }); + + test('Test with positive offset and minutes', () { + var dateTime = DateTime.utc(2011, 6, 6, 5, 5, 3); + var str = toIso8601WithTimezone(dateTime, Duration(hours: 10)); + + expect(str, "2011-06-06T05:05:03+10:00"); + }); + + test('Test with negative offset', () { + var dateTime = DateTime.utc(2011, 6, 6, 5, 5, 3); + var str = toIso8601WithTimezone(dateTime, Duration(hours: -5)); + + expect(str, "2011-06-06T05:05:03-05:00"); + }); + + test('Test with negative offset and minutes', () { + var dateTime = DateTime.utc(2011, 6, 6, 5, 5, 3); + var str = + toIso8601WithTimezone(dateTime, Duration(hours: -11, minutes: -30)); + + expect(str, "2011-06-06T05:05:03-11:30"); + }); }); }