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();