diff --git a/athenasub/src/athenatime.cpp b/athenasub/src/athenatime.cpp
index 6b59340afaccb14db1282397700602774bfb6cfc..642c4cf488f7aeee2bd8ce25a24be44e629ce76f 100644
--- a/athenasub/src/athenatime.cpp
+++ b/athenasub/src/athenatime.cpp
@@ -136,17 +136,36 @@ void Time::ParseString(const String &data)
 	size_t len = data.Length();
 	size_t curIndex = 0;
 	char cur = 0;
+	bool gotDecimal = false;
 	for (size_t i=0;i<len;i++) {
 		cur = data[i];
-		if (cur == ':' || cur == '.' || cur == ',' || cur == ';') {
+
+		// Got a separator
+		bool isDecimalSeparator = (cur == '.' || cur == ',');
+		if (isDecimalSeparator || cur == ':' || cur == ';') {
+			if (isDecimalSeparator) {
+				if (gotDecimal) break;
+				gotDecimal = true;
+			}
 			values.at(curIndex++) = data.SubToInteger(last,i);
 			last = i+1;
 		}
+
+		// Reached end of string
 		if (i == len-1) {
 			int value = data.SubToInteger(last,len);
 			size_t digits = len - last;
-			if (digits == 2) value *= 10;
-			if (digits == 1) value *= 100;
+
+			// Ended in decimal, so we gotta normalize it to 3 digits
+			if (gotDecimal) {
+				if (digits != 3) {
+					if (digits == 2) value *= 10;
+					else if (digits == 1) value *= 100;
+					else if (digits > 3) {
+						
+					}
+				}
+			}
 			values.at(curIndex++) = value;
 		}
 	}
@@ -154,8 +173,9 @@ void Time::ParseString(const String &data)
 	// Turn into milliseconds
 	size_t mult[] = { 0, 1, 1000, 60000, 3600000 };
 	size_t accum = 0;
+	size_t adjust = gotDecimal ? 0 : 1;
 	for (int i=(int)curIndex;--i>=0;) {
-		accum += values[i] * mult[curIndex-i];
+		accum += values[i] * mult[curIndex-i+adjust];
 	}
 	
 	// Set