From 4cd2b3fba1400244fa38715e80a50e7faf6b327d Mon Sep 17 00:00:00 2001
From: Manoel Aranda Neto <marandaneto@gmail.com>
Date: Tue, 11 Feb 2020 12:02:53 +0100
Subject: [PATCH 1/2] support mills timestamp

---
 .../adapters/DateDeserializerAdapter.java     | 10 +++++++-
 .../android/core/AndroidSerializerTest.kt     | 24 +++++++++++++++++++
 .../main/java/io/sentry/core/DateUtils.java   | 23 ++++++++++++++++--
 3 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java
index 1ec509810..01f632547 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java
@@ -27,7 +27,15 @@ public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationConte
     try {
       return json == null ? null : DateUtils.getDateTime(json.getAsString());
     } catch (Exception e) {
-      logger.log(SentryLevel.ERROR, "Error when deserializing Date", e);
+      logger.log(
+          SentryLevel.ERROR,
+          "Error when deserializing UTC timestamp format, might be mills timestamp format.",
+          e);
+    }
+    try {
+      return DateUtils.getDateTimeWithMillsPrecision(json.getAsString());
+    } catch (Exception e) {
+      logger.log(SentryLevel.ERROR, "Error when deserializing mills timestamp format.", e);
     }
     return null;
   }
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt
index 715728f7c..fad6386d4 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt
@@ -73,6 +73,30 @@ class AndroidSerializerTest {
         assertEquals(expected, actual.timestamp)
     }
 
+    @Test
+    fun `when deserializing mills timestamp, it should become a SentryEvent-Date`() {
+        val dateIsoFormat = "1581410911"
+        val expected = DateUtils.getDateTimeWithMillsPrecision(dateIsoFormat)
+
+        val jsonEvent = "{\"timestamp\":\"$dateIsoFormat\"}"
+
+        val actual = serializer.deserializeEvent(StringReader(jsonEvent))
+
+        assertEquals(expected, actual.timestamp)
+    }
+
+    @Test
+    fun `when deserializing mills timestamp with mills precision, it should become a SentryEvent-Date`() {
+        val dateIsoFormat = "1581410911.988"
+        val expected = DateUtils.getDateTimeWithMillsPrecision(dateIsoFormat)
+
+        val jsonEvent = "{\"timestamp\":\"$dateIsoFormat\"}"
+
+        val actual = serializer.deserializeEvent(StringReader(jsonEvent))
+
+        assertEquals(expected, actual.timestamp)
+    }
+
     @Test
     fun `when deserializing unknown properties, it should be added to unknown field`() {
         val sentryEvent = generateEmptySentryEvent()
diff --git a/sentry-core/src/main/java/io/sentry/core/DateUtils.java b/sentry-core/src/main/java/io/sentry/core/DateUtils.java
index b1825a1a4..c93bb8483 100644
--- a/sentry-core/src/main/java/io/sentry/core/DateUtils.java
+++ b/sentry-core/src/main/java/io/sentry/core/DateUtils.java
@@ -40,9 +40,9 @@ public static Date getCurrentDateTime() {
   }
 
   /**
-   * Get date
+   * Get Java Date from UTC timestamp format
    *
-   * @param timestamp already UTC format
+   * @param timestamp UTC format eg 2000-12-31T23:59:58Z
    * @return the Date
    */
   public static Date getDateTime(String timestamp) throws IllegalArgumentException {
@@ -54,6 +54,25 @@ public static Date getDateTime(String timestamp) throws IllegalArgumentException
     }
   }
 
+  /**
+   * Get Java Date from mills timestamp format
+   *
+   * @param timestamp mills format eg 1581410911.988 (1581410911 seconds and 988 mills)
+   * @return the Date
+   */
+  public static Date getDateTimeWithMillsPrecision(String timestamp)
+      throws IllegalArgumentException {
+    try {
+      String[] times = timestamp.split("\\.", -1);
+      long seconds = Long.parseLong(times[0]);
+      long mills = times.length > 1 ? Long.parseLong(times[1]) : 0;
+
+      return new Date((seconds * 1000) + mills);
+    } catch (NumberFormatException e) {
+      throw new IllegalArgumentException("timestamp is not mills format " + timestamp);
+    }
+  }
+
   /**
    * Get date formatted as expected by Sentry.
    *

From fecdf933b7a59b899f150bc7b3e0fcbd0eee1891 Mon Sep 17 00:00:00 2001
From: Manoel Aranda Neto <marandaneto@gmail.com>
Date: Tue, 11 Feb 2020 14:18:27 +0100
Subject: [PATCH 2/2] change log level when deserializing UTC timestamp error

---
 .../sentry/android/core/adapters/DateDeserializerAdapter.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java
index 01f632547..6733b2699 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java
@@ -28,8 +28,8 @@ public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationConte
       return json == null ? null : DateUtils.getDateTime(json.getAsString());
     } catch (Exception e) {
       logger.log(
-          SentryLevel.ERROR,
-          "Error when deserializing UTC timestamp format, might be mills timestamp format.",
+          SentryLevel.DEBUG,
+          "Error when deserializing UTC timestamp format, it might be mills timestamp format.",
           e);
     }
     try {