Write the date time in iso8601 + timezone

This is not perfect as when parsing the datetime, we're ignoring the
timezone.
This commit is contained in:
Vishesh Handa
2019-01-15 15:09:47 +01:00
parent 04b65fbf95
commit 075d353447
4 changed files with 80 additions and 9 deletions

28
lib/datetime_utils.dart Normal file
View File

@ -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;
}
}

View File

@ -1,3 +1,5 @@
import 'package:journal/datetime_utils.dart';
typedef NoteAdder(Note note); typedef NoteAdder(Note note);
typedef NoteRemover(Note note); typedef NoteRemover(Note note);
typedef NoteUpdator(Note note); typedef NoteUpdator(Note note);
@ -12,24 +14,51 @@ class Note implements Comparable {
factory Note.fromJson(Map<String, dynamic> json) { factory Note.fromJson(Map<String, dynamic> json) {
String id; String id;
if (json.containsKey("id")) { if (json.containsKey("id")) {
var val = json["id"]; id = json["id"].toString();
if (val.runtimeType == String) { }
id = val;
} else { DateTime created;
id = val.toString(); 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( return new Note(
id: id, id: id,
created: DateTime.parse(json['created']), created: created,
body: json['body'], body: body,
); );
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
"created": created.toIso8601String(), "created": toIso8601WithTimezone(created),
"body": body, "body": body,
"id": id, "id": id,
}; };

View File

@ -12,6 +12,7 @@ import 'package:journal/note.dart';
import 'package:journal/storage/notes_repository.dart'; import 'package:journal/storage/notes_repository.dart';
import 'package:journal/storage/git_storage.dart'; import 'package:journal/storage/git_storage.dart';
import 'package:journal/storage/git.dart'; import 'package:journal/storage/git.dart';
import 'package:journal/datetime_utils.dart';
Future<Directory> getNotesDir() async { Future<Directory> getNotesDir() async {
var appDir = await getGitBaseDirectory(); var appDir = await getGitBaseDirectory();
@ -49,7 +50,7 @@ class StateContainerState extends State<StateContainer> {
getDirectory: getNotesDir, getDirectory: getNotesDir,
dirName: "journal", dirName: "journal",
gitCloneUrl: "root@bcn.vhanda.in:git/test", gitCloneUrl: "root@bcn.vhanda.in:git/test",
fileNameGenerator: (Note n) => n.created.toIso8601String(), fileNameGenerator: (Note n) => toIso8601WithTimezone(n.created),
); );
StateContainerState(bool onBoardingCompleted) { StateContainerState(bool onBoardingCompleted) {

View File

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