diff --git a/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp b/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp
index 284e15c1df85810c77b029c434f913d2f25fa4d9..397b5e3b83ad4aa3b43c0f095cc6813c64f15717 100644
--- a/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp
+++ b/source/RobotAPI/libraries/armem/component/MemoryRemoteGui.cpp
@@ -88,14 +88,9 @@ namespace armarx::armem
 
     MemoryRemoteGui::GroupBox MemoryRemoteGui::makeGroupBox(const EntitySnapshot& snapshot) const
     {
-        static const char* mu = "\u03BC";
-        (void) mu;
         GroupBox group;
         std::stringstream ss;
-        ss << "t = " << snapshot.time.toString("%Y-%m-%d %H:%M:%S")
-           << "." << snapshot.time.toMicroSeconds() % 1000
-           // << " (" << snapshot.time.toMicroSeconds() << " " << mu << "s" << ")"
-           ;
+        ss << "t = " << armem::toDateTimeMilliSeconds(snapshot.time);
         group.setLabel(ss.str());
 
         for (const auto& instance : snapshot.instances)
diff --git a/source/RobotAPI/libraries/armem/core/Time.cpp b/source/RobotAPI/libraries/armem/core/Time.cpp
index 4f20811811e4520188ac778d33831d91d9ad508c..40f25dc9fefead472651349ef3b20da0c0ee6a25 100644
--- a/source/RobotAPI/libraries/armem/core/Time.cpp
+++ b/source/RobotAPI/libraries/armem/core/Time.cpp
@@ -1,2 +1,48 @@
 #include "Time.h"
 
+#include <cmath>
+
+
+namespace armarx
+{
+
+
+    std::string armem::toStringMilliSeconds(const Time& time, int decimals)
+    {
+        std::stringstream ss;
+        ss << time.toMilliSeconds();
+        if (decimals > 0)
+        {
+            int div = int(std::pow(10, 3 - decimals));
+            ss << "." << (time.toMicroSeconds() % 1000) / div;
+        }
+        ss << " ms";
+        return ss.str();
+    }
+
+
+    std::string armem::toStringMicroSeconds(const Time& time)
+    {
+        static const char* mu = "\u03BC";
+        std::stringstream ss;
+        ss << time.toMicroSeconds() << " " << mu << "s";
+        return ss.str();
+    }
+
+
+    std::string armem::toDateTimeMilliSeconds(const Time& time, int decimals)
+    {
+        std::stringstream ss;
+        ss << time.toString("%Y-%m-%d %H:%M:%S");
+        if (decimals > 0)
+        {
+            int div = int(std::pow(10, 6 - decimals));
+            ss << "." << (time.toMicroSeconds() % int(1e6)) / div;
+        }
+
+        return ss.str();
+    }
+
+}
+
+
diff --git a/source/RobotAPI/libraries/armem/core/Time.h b/source/RobotAPI/libraries/armem/core/Time.h
index caf4342467243336fe7868292abcc6843c11d371..01a420f14e67d06fdbb555d5553f8a69cc6263c8 100644
--- a/source/RobotAPI/libraries/armem/core/Time.h
+++ b/source/RobotAPI/libraries/armem/core/Time.h
@@ -1,3 +1,5 @@
+#pragma once
+
 #include <IceUtil/Time.h>
 
 
@@ -6,4 +8,22 @@ namespace armarx::armem
 
     using Time = IceUtil::Time;
 
+    /**
+     * @brief Returns `time` as e.g. "123456789.012 ms".
+     * @param decimals How many sub-millisecond decimals to include.
+     */
+    std::string toStringMilliSeconds(const Time& time, int decimals = 3);
+
+    /**
+     * @brief Returns `time` as e.g. "123456789012 `mu`s".
+     * The output string contains the actual greek letter `mu`.
+     */
+    std::string toStringMicroSeconds(const Time& time);
+
+    /**
+     * @brief Returns `time`as e.g. "2020-11-16 17:01:54.123".
+     * @param decimals How many sub-second decimals to include.
+     */
+    std::string toDateTimeMilliSeconds(const Time& time, int decimals = 6);
+
 }
diff --git a/source/RobotAPI/libraries/armem/memory/Entity.cpp b/source/RobotAPI/libraries/armem/memory/Entity.cpp
index 7bd983e372246abd11bcd5f0c16bf45fdc3f91c8..502c29fb5868690c7630b7649aad794acb61222f 100644
--- a/source/RobotAPI/libraries/armem/memory/Entity.cpp
+++ b/source/RobotAPI/libraries/armem/memory/Entity.cpp
@@ -31,7 +31,7 @@ namespace armarx::armem
         }
         else
         {
-            throw error::MissingEntry("entity snapshot", std::to_string(time.toMilliSeconds()),
+            throw error::MissingEntry("entity snapshot", toDateTimeMilliSeconds(time),
                                       "entity", this->name);
         }
     }
diff --git a/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp
index 99c3afc7cfa6edec443f56b5a3d81b535c2c21c3..b55c477c5480966908a929c5c99388e1fc671c17 100644
--- a/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp
+++ b/source/RobotAPI/libraries/armem/memory/EntitySnapshot.cpp
@@ -32,7 +32,7 @@ namespace armarx::armem
         else
         {
             throw armem::error::MissingEntry("instance", std::to_string(index),
-                                             "entity snapshot", std::to_string(time.toMicroSeconds()));
+                                             "entity snapshot", toDateTimeMilliSeconds(time));
         }
     }
 
diff --git a/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp b/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp
index 33bc05703ac6689e03c7585cc93348db383fb677..222e528acd236de67a356a5cb432cf9866873e74 100644
--- a/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArmemMemoryTest.cpp
@@ -35,6 +35,26 @@ namespace armem = armarx::armem;
 namespace aron = armarx::aron;
 
 
+BOOST_AUTO_TEST_CASE(test_time_to_string)
+{
+    // 1: seconds, 2: milliseconds, 3: microseconds
+    armem::Time time = armem::Time::microSeconds(111111345789);
+
+    BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time), "111111345.789 ms");
+    BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 0), "111111345 ms");
+    BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 1), "111111345.7 ms");
+    BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 2), "111111345.78 ms");
+    BOOST_CHECK_EQUAL(armem::toStringMilliSeconds(time, 3), "111111345.789 ms");
+
+    BOOST_CHECK_EQUAL(armem::toStringMicroSeconds(time), "111111345789 " "\u03BC" "s");
+
+    BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time), "1970-01-02 07:51:51.345");
+    BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time, 0), "1970-01-02 07:51:51");
+    BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time, 3), "1970-01-02 07:51:51.345");
+    BOOST_CHECK_EQUAL(armem::toDateTimeMilliSeconds(time, 6), "1970-01-02 07:51:51.345789");
+}
+
+
 BOOST_AUTO_TEST_CASE(test_segment_setup)
 {
     armem::InternalEntityUpdate update;