Fix rounding when handling negative timestamps (#580)
diff --git a/protobuf/lib/src/protobuf/mixins/well_known.dart b/protobuf/lib/src/protobuf/mixins/well_known.dart index e5215b2..e7ac9fe 100644 --- a/protobuf/lib/src/protobuf/mixins/well_known.dart +++ b/protobuf/lib/src/protobuf/mixins/well_known.dart
@@ -160,7 +160,7 @@ /// Time zone information will not be preserved. static void setFromDateTime(TimestampMixin target, DateTime dateTime) { var micros = dateTime.microsecondsSinceEpoch; - target.seconds = Int64(micros ~/ Duration.microsecondsPerSecond); + target.seconds = Int64((micros / Duration.microsecondsPerSecond).floor()); target.nanos = (micros % Duration.microsecondsPerSecond).toInt() * 1000; }
diff --git a/protoc_plugin/test/timestamp_test.dart b/protoc_plugin/test/timestamp_test.dart index 5d02e21..6203139 100644 --- a/protoc_plugin/test/timestamp_test.dart +++ b/protoc_plugin/test/timestamp_test.dart
@@ -23,6 +23,17 @@ expect(fromProto, dateTime); }); + test('negative Timestamp', () { + final secondBeforeEpoch = Timestamp(seconds: Int64(-1), nanos: 1000000); + var dateTime = DateTime.fromMillisecondsSinceEpoch(-999, isUtc: true); + + expect(secondBeforeEpoch.toDateTime().millisecondsSinceEpoch, + dateTime.millisecondsSinceEpoch); + expect(secondBeforeEpoch.toDateTime(), dateTime); + expect(Timestamp.fromDateTime(dateTime).nanos, 1000000); + expect(Timestamp.fromDateTime(dateTime).seconds, Int64(-1)); + }); + test('local datetime -> timestamp -> datetime', () { var dateTime = DateTime(2019, 02, 15, 10, 21, 25, 5, 5); var fromProto = Timestamp.fromDateTime(dateTime).toDateTime();