Index: src/test/java/org/mortbay/util/ajax/JSONTest.java
===================================================================
--- src/test/java/org/mortbay/util/ajax/JSONTest.java	(revision 2771)
+++ src/test/java/org/mortbay/util/ajax/JSONTest.java	(working copy)
@@ -2,15 +2,18 @@
 import java.io.StringReader;
 import java.lang.reflect.Array;
 import java.math.BigDecimal;
+import java.text.DateFormatSymbols;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 
-import org.mortbay.util.ajax.JSON;
+import junit.framework.TestCase;
+
 import org.mortbay.util.ajax.JSON.Output;
 
-import junit.framework.TestCase;
-
 public class JSONTest extends TestCase
 {   
     String test="\n\n\n\t\t    "+
@@ -228,8 +231,9 @@
     /* ------------------------------------------------------------ */
     public void testConvertor()
     {
+        // test case#1 - force timezone to GMT
         JSON json = new JSON();
-        json.addConvertor(Date.class,new JSONDateConvertor());
+        json.addConvertor(Date.class, new JSONDateConvertor("MM/dd/yyyy HH:mm:ss zzz", TimeZone.getTimeZone("GMT"),true));
         json.addConvertor(Object.class,new JSONObjectConvertor());
 
         Woggle w0 = new Woggle();
@@ -244,7 +248,8 @@
         g0.tested=true;
         
         HashMap map = new HashMap();
-        map.put("date",new Date(1));
+        Date dummyDate = new Date(1);
+        map.put("date", dummyDate);
         map.put("w0",w0);
 
         StringBuffer buf = new StringBuffer();
@@ -252,11 +257,59 @@
         String js=buf.toString();
         
         System.err.println(js);
-        assertTrue(js.indexOf("\"date\":\"Thu Jan 01 00:00:00 GMT 1970\"")>=0);
+        assertTrue(js.indexOf("\"value\":\"01/01/1970 00:00:00 GMT\"")>=0);
         assertTrue(js.indexOf("org.mortbay.util.ajax.JSONTest$Woggle")>=0);
         assertTrue(js.indexOf("org.mortbay.util.ajax.JSONTest$Gizmo")<0);
         assertTrue(js.indexOf("\"tested\":true")>=0);
 
+        // test case#2 - using the system timezone
+        Locale l = new Locale(System.getProperty("user.language"), System.getProperty("user.country"));
+        String tzone3Letter = TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT);
+        String format = "MM/dd/yyyy HH:mm:ss zzz";
+        
+        System.err.print("language: " + System.getProperty("user.language") + ", ");
+        System.err.print("country: " + System.getProperty("user.country") + ", ");
+        System.err.println("timezone: " + tzone3Letter);
+        
+        json.addConvertor(Date.class, new JSONDateConvertor(format, TimeZone.getDefault(), true, l));
+        buf = new StringBuffer();
+        json.append(buf,map);
+        js=buf.toString();
+        
+        System.err.println(js);
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        sdf.setTimeZone(TimeZone.getDefault());
+        assertTrue(js.indexOf("\"value\":\"" + sdf.format(dummyDate) + "\"")>=0);
+        assertTrue(js.indexOf("org.mortbay.util.ajax.JSONTest$Woggle")>=0);
+        assertTrue(js.indexOf("org.mortbay.util.ajax.JSONTest$Gizmo")<0);
+        assertTrue(js.indexOf("\"tested\":true")>=0);
+        
+        // test case#3
+        l = new Locale("ja", "JP");
+        TimeZone tzone = TimeZone.getTimeZone("JST");
+        tzone3Letter = tzone.getDisplayName(false, TimeZone.SHORT);
+        format = "EEE MMMMM dd HH:mm:ss zzz yyyy";
+        
+        System.err.print("language: ja" + ", ");
+        System.err.print("country: JP" + ", ");
+        System.err.println("timezone: " + tzone3Letter);
+        
+        json.addConvertor(Date.class, new JSONDateConvertor(format, tzone, true, l));
+        buf = new StringBuffer();
+        json.append(buf,map);
+        js=buf.toString();
+        
+        System.err.println(js);
+        sdf.applyPattern(format);
+        sdf.setDateFormatSymbols(new DateFormatSymbols(l));
+        sdf.setTimeZone(tzone);
+        
+        assertTrue(js.indexOf("\"value\":\"" + sdf.format(dummyDate) + "\"")>=0);
+        assertTrue(js.indexOf("org.mortbay.util.ajax.JSONTest$Woggle")>=0);
+        assertTrue(js.indexOf("org.mortbay.util.ajax.JSONTest$Gizmo")<0);
+        assertTrue(js.indexOf("\"tested\":true")>=0);
+        
+        // test case#4 
         json.addConvertor(Date.class,new JSONDateConvertor(true));
         w0.nested=null;
         buf = new StringBuffer();
@@ -271,8 +324,6 @@
         
         assertTrue(map.get("date") instanceof Date);
         assertTrue(map.get("w0") instanceof Woggle);
-        
-           
     }
     
 /* java 1.5 only 
Index: src/main/java/org/mortbay/util/ajax/JSONDateConvertor.java
===================================================================
--- src/main/java/org/mortbay/util/ajax/JSONDateConvertor.java	(revision 2574)
+++ src/main/java/org/mortbay/util/ajax/JSONDateConvertor.java	(working copy)
@@ -1,7 +1,9 @@
 package org.mortbay.util.ajax;
 
+import java.text.DateFormatSymbols;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 import java.util.Map;
 import java.util.TimeZone;
 
@@ -41,6 +43,15 @@
         _format.setTimeZone(zone);
     }
     
+    public JSONDateConvertor(String format, TimeZone zone, boolean fromJSON, Locale locale)
+    {
+        _dateCache = new DateCache(format, locale);
+        _dateCache.setTimeZone(zone);
+        _fromJSON = fromJSON;
+        _format = new SimpleDateFormat(format, new DateFormatSymbols(locale));
+        _format.setTimeZone(zone);
+    }
+    
     public Object fromJSON(Map map)
     {
         if (!_fromJSON)
