From ad6d47ef0f786925bff6a12e043f584f9de301ce Mon Sep 17 00:00:00 2001
From: Vishesh Handa <me@vhanda.in>
Date: Mon, 9 Dec 2019 01:56:46 +0100
Subject: [PATCH] Fix dateTime to string with timezone

We should just use the 'timezone' dart package and not handle this
ourselves as we're probably fucking it up in other places.

This fixes #42
---
 lib/utils/datetime.dart       | 24 ++++++++++++++++--------
 test/datetime_utils_test.dart | 29 +++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 8 deletions(-)

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");
+    });
   });
 }