diff --git a/src/sbbs3/atcodes.cpp b/src/sbbs3/atcodes.cpp
index dc954760d548263b7c4b7b400fcd2135c1419619..fee8372516062fb133f3f0c142805ba3a24c1fa6 100644
--- a/src/sbbs3/atcodes.cpp
+++ b/src/sbbs3/atcodes.cpp
@@ -147,9 +147,10 @@ const char* sbbs_t::atcode(char* sp, char* str, size_t maxlen)
 
 	if(!strcmp(sp,"UPTIME")) {
 		extern volatile time_t uptime;
-		time_t up=time(NULL)-uptime;
-		if(up<0)
-			up=0;
+		time_t up=0;
+		now = time(NULL);
+		if (uptime != 0 && now >= uptime)
+			up = now-uptime;
 		char   days[64]="";
 		if((up/(24*60*60))>=2) {
 	        sprintf(days,"%lu days ",(ulong)(up/(24L*60L*60L)));