diff --git a/src/i_system.h b/src/i_system.h
index a3790dca3..a2dd81cca 100644
--- a/src/i_system.h
+++ b/src/i_system.h
@@ -50,7 +50,7 @@ tic_t I_GetTime(void);
   */
 precise_t I_GetPreciseTime(void);
 
-/**	\brief	Returns the difference between precise times as microseconds.
+/**	\brief	Converts a precise_t to microseconds and casts it to a 32 bit integer.
   */
 int I_PreciseToMicros(precise_t);
 
diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index a0b5ff873..12ad4fee0 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -31,6 +31,7 @@
 #include "m_misc.h" // M_MapNumber
 #include "b_bot.h" // B_UpdateBotleader
 #include "d_clisrv.h" // CL_RemovePlayer
+#include "i_system.h" // I_GetPreciseTime, I_PreciseToMicros
 
 #include "lua_script.h"
 #include "lua_libs.h"
@@ -3879,6 +3880,12 @@ static int lib_gTicsToMilliseconds(lua_State *L)
 	return 1;
 }
 
+static int lib_getTimeMicros(lua_State *L)
+{
+	lua_pushinteger(L, I_PreciseToMicros(I_GetPreciseTime()));
+	return 1;
+}
+
 static luaL_Reg lib[] = {
 	{"print", lib_print},
 	{"chatprint", lib_chatprint},
@@ -4153,6 +4160,8 @@ static luaL_Reg lib[] = {
 	{"G_TicsToCentiseconds",lib_gTicsToCentiseconds},
 	{"G_TicsToMilliseconds",lib_gTicsToMilliseconds},
 
+	{"getTimeMicros",lib_getTimeMicros},
+
 	{NULL, NULL}
 };
 
diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index 2ec28ebc8..ccec37093 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -2163,7 +2163,13 @@ precise_t I_GetPreciseTime(void)
 
 int I_PreciseToMicros(precise_t d)
 {
-	return (int)(d / (timer_frequency / 1000000.0));
+	// d is going to be converted into a double. So remove the highest bits
+	// to avoid loss of precision in the lower bits, for the (probably rare) case
+	// that the higher bits are actually used.
+	d &= ((precise_t)1 << 53) - 1; // The mantissa of a double can handle 53 bits at most.
+	// The resulting double from the calculation is converted first to UINT64 to avoid overflow,
+	// which is undefined behaviour when converting floating point values to integers.
+	return (int)(UINT64)(d / (timer_frequency / 1000000.0));
 }
 
 //