From 075d3534477e5d656c712b5078cc7b9e5da53008 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Tue, 15 Jan 2019 15:09:47 +0100 Subject: [PATCH] Write the date time in iso8601 + timezone This is not perfect as when parsing the datetime, we're ignoring the timezone. --- lib/datetime_utils.dart | 28 ++++++++++++++++++++++ lib/note.dart | 45 ++++++++++++++++++++++++++++------- lib/state_container.dart | 3 ++- test/datetime_utils_test.dart | 13 ++++++++++ 4 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 lib/datetime_utils.dart create mode 100644 test/datetime_utils_test.dart diff --git a/lib/datetime_utils.dart b/lib/datetime_utils.dart new file mode 100644 index 00000000..3ee41ab2 --- /dev/null +++ b/lib/datetime_utils.dart @@ -0,0 +1,28 @@ +import 'package:intl/intl.dart'; + +String toIso8601WithTimezone(DateTime dt) { + var result = DateFormat("y-M-dTH:m:s").format(dt); + var offset = dt.timeZoneOffset; + if (offset.inSeconds == 0) { + return result + 'Z'; + } else { + int minutes = (offset.inMinutes % 60); + int hours = offset.inHours.toInt(); + + String minutesStr; + if (minutes < 10) { + minutesStr = '0' + minutes.toString(); + } else { + minutesStr = minutes.toString(); + } + + String hourStr; + if (hours < 10) { + hourStr = '0' + hours.toString(); + } else { + hourStr = hours.toString(); + } + + return result + '+' + hourStr + ':' + minutesStr; + } +} diff --git a/lib/note.dart b/lib/note.dart index 1758b8cb..abc31c5e 100644 --- a/lib/note.dart +++ b/lib/note.dart @@ -1,3 +1,5 @@ +import 'package:journal/datetime_utils.dart'; + typedef NoteAdder(Note note); typedef NoteRemover(Note note); typedef NoteUpdator(Note note); @@ -12,24 +14,51 @@ class Note implements Comparable { factory Note.fromJson(Map json) { String id; if (json.containsKey("id")) { - var val = json["id"]; - if (val.runtimeType == String) { - id = val; - } else { - id = val.toString(); + id = json["id"].toString(); + } + + DateTime created; + if (json.containsKey("created")) { + var createdStr = json['created'].toString(); + try { + created = DateTime.parse(json['created']); + } catch (ex) {} + + if (created == null) { + var regex = new RegExp( + r"(\d{4})-(\d{2})-(\d{2})T(\d{2})\:(\d{2})\:(\d{2})\+(\d{2})\:(\d{2})"); + if (regex.hasMatch(createdStr)) { + // FIXME: Handle the timezone! + createdStr = createdStr.substring(0, 19); + created = DateTime.parse(json['created']); + } } + + // FIXME: Get created from file system or from git! + if (created == null) { + created = DateTime.now(); + } + } + + if (id == null && created != null) { + id = toIso8601WithTimezone(created); + } + + String body = ""; + if (json.containsKey("body")) { + body = json['body']; } return new Note( id: id, - created: DateTime.parse(json['created']), - body: json['body'], + created: created, + body: body, ); } Map toJson() { return { - "created": created.toIso8601String(), + "created": toIso8601WithTimezone(created), "body": body, "id": id, }; diff --git a/lib/state_container.dart b/lib/state_container.dart index 8e515df9..13ce97ee 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -12,6 +12,7 @@ import 'package:journal/note.dart'; import 'package:journal/storage/notes_repository.dart'; import 'package:journal/storage/git_storage.dart'; import 'package:journal/storage/git.dart'; +import 'package:journal/datetime_utils.dart'; Future getNotesDir() async { var appDir = await getGitBaseDirectory(); @@ -49,7 +50,7 @@ class StateContainerState extends State { getDirectory: getNotesDir, dirName: "journal", gitCloneUrl: "root@bcn.vhanda.in:git/test", - fileNameGenerator: (Note n) => n.created.toIso8601String(), + fileNameGenerator: (Note n) => toIso8601WithTimezone(n.created), ); StateContainerState(bool onBoardingCompleted) { diff --git a/test/datetime_utils_test.dart b/test/datetime_utils_test.dart new file mode 100644 index 00000000..cd171bcc --- /dev/null +++ b/test/datetime_utils_test.dart @@ -0,0 +1,13 @@ +import 'package:test/test.dart'; +import 'package:journal/datetime_utils.dart'; + +main() { + group('DateTime Utils', () { + test('Test random date', () { + var dateTime = DateTime.utc(2011, 12, 23, 10, 15, 30); + var str = toIso8601WithTimezone(dateTime); + + expect(str, "2011-12-23T10:15:30+00:00"); + }); + }); +}