diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index 5fea5006bb112dce0fb797e144e5b4fcbd4ba1c5..55d7469b85a0cdfc7bb7f7fdf5bd4e36902e7f75 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -2140,41 +2140,38 @@ time_t fmsgtime(char *str)
 
 static short fmsgzone(char* p)
 {
-	char hr[4];
-	char min[4];
-	short val;
-	BOOL west=TRUE;
+	char	hr[4]="";
+	char	min[4]="";
+	short	val;
+	BOOL	west=TRUE;
 
 	if(*p=='-')
 		p++;
 	else
 		west=FALSE;
 
-	sprintf(hr,"%.2s",p);
-	sprintf(min,"%.2s",p+1);
+	if(strlen(p)>=2)
+		sprintf(hr,"%.2s",p);
+	if(strlen(p+2)>=2)
+		sprintf(min,"%.2s",p+2);
 
 	val=atoi(hr)*60;
 	val+=atoi(min);
 
 	if(west)
-		switch(val) {
-			case 0x0F0:
-				return(AST);
-			case 0x12C:
-				return(EST);
-			case 0x168:
-				return(CST);
-			case 0x1A4:
-				return(MST);
-			case 0x1E0:
-				return(PST);
-			case 0x21C:
-				return(YST);
-			case 0x258:
-				return(HST);
-			case 0x294:
-				return(BST);
+		switch(val|US_ZONE) {
+			case AST:
+			case EST:
+			case CST:
+			case MST:
+			case PST:
+			case YST:
+			case HST:
+			case BST:
+				/* standard US timezone */
+				return(val|US_ZONE);
 			default: 
+				/* non-standard timezone */
 				return(-val);
 		}
 	return(val);