diff --git a/date.go b/date.go
index 5368da3..ad54034 100644
--- a/date.go
+++ b/date.go
@@ -26,6 +26,8 @@
 // Date
 /////////////////////////////////////////
 
+var ZeroDate = time.Time{}
+
 // # time in UTC encoded as 64-bit long milliseconds since epoch
 // ::= x4a b7 b6 b5 b4 b3 b2 b1 b0
 // ::= x4b b3 b2 b1 b0       # minutes since epoch
@@ -46,7 +48,7 @@
 // # time in UTC encoded as 64-bit long milliseconds since epoch
 // ::= x4a b7 b6 b5 b4 b3 b2 b1 b0
 // ::= x4b b3 b2 b1 b0       # minutes since epoch
-func (d *Decoder) decDate(flag int32) (interface{}, error) {
+func (d *Decoder) decDate(flag int32) (time.Time, error) {
 	var (
 		err error
 		l   int
@@ -65,7 +67,7 @@
 
 	switch {
 	case tag == BC_NULL:
-		return nil, nil
+		return ZeroDate, nil
 	case tag == BC_DATE: //'d': //date
 		s = buf[:8]
 		l, err = d.next(s)
diff --git a/date_test.go b/date_test.go
index 02cc93b..0d6ba97 100644
--- a/date_test.go
+++ b/date_test.go
@@ -15,10 +15,24 @@
 package hessian
 
 import (
+	"github.com/stretchr/testify/assert"
 	"testing"
 	"time"
 )
 
+func init() {
+	RegisterPOJO(&DateDemo{})
+}
+
+type DateDemo struct {
+	Name string
+	Date time.Time
+}
+
+func (DateDemo) JavaClassName() string {
+	return "test.model.DateDemo"
+}
+
 func TestEncDate(t *testing.T) {
 	var (
 		v   string
@@ -71,3 +85,43 @@
 	testJavaDecode(t, "argDate_1", time.Date(1998, 5, 8, 9, 51, 31, 0, time.UTC))
 	testJavaDecode(t, "argDate_2", time.Date(1998, 5, 8, 9, 51, 0, 0, time.UTC))
 }
+
+func TestEncDateNull(t *testing.T) {
+	var (
+		e   *Encoder
+		d   *Decoder
+		res interface{}
+	)
+	date := DateDemo{
+		Name: "s",
+		Date: ZeroDate,
+	}
+	e = NewEncoder()
+	e.Encode(date)
+	if len(e.Buffer()) == 0 {
+		t.Fail()
+	}
+	d = NewDecoder(e.Buffer())
+	res, _ = d.Decode()
+	assert.Equal(t, ZeroDate, res.(*DateDemo).Date)
+}
+
+func TestDateNulJavaDecode(t *testing.T) {
+	date := DateDemo{
+		Name: "s",
+		Date: ZeroDate,
+	}
+	testJavaDecode(t, "customArgTypedFixedList_DateNull", date)
+}
+
+func TestDateNullDecode(t *testing.T) {
+
+	doTestDateNull(t, "customReplyTypedFixedDateNull")
+}
+
+func doTestDateNull(t *testing.T, method string) {
+	testDecodeFrameworkFunc(t, method, func(r interface{}) {
+		t.Logf("%#v", r)
+		assert.Equal(t, ZeroDate, r.(*DateDemo).Date)
+	})
+}
diff --git a/encode.go b/encode.go
index f5f333b..2117bb2 100644
--- a/encode.go
+++ b/encode.go
@@ -101,9 +101,12 @@
 		e.buffer = encInt64(e.buffer, int64(val))
 
 	case time.Time:
-		e.buffer = encDateInMs(e.buffer, val)
-		// e.buffer = encDateInMimute(v.(time.Time), e.buffer)
-
+		if ZeroDate == val {
+			e.buffer = encNull(e.buffer)
+		} else {
+			e.buffer = encDateInMs(e.buffer, val)
+			// e.buffer = encDateInMimute(v.(time.Time), e.buffer)
+		}
 	case float32:
 		e.buffer = encFloat(e.buffer, float64(val))
 
diff --git a/test_hessian/src/main/java/test/TestCustomDecode.java b/test_hessian/src/main/java/test/TestCustomDecode.java
index 27ac4ce..dd9245d 100644
--- a/test_hessian/src/main/java/test/TestCustomDecode.java
+++ b/test_hessian/src/main/java/test/TestCustomDecode.java
@@ -26,6 +26,7 @@
 import java.util.Date;
 import java.util.List;
 import java.math.BigDecimal;
+import test.model.DateDemo;
 
 public class TestCustomDecode {
 
@@ -168,4 +169,9 @@
         BigDecimal o = (BigDecimal) input.readObject();
         return o.toString().equals( "100.256");
     }
+
+    public Object customArgTypedFixedList_DateNull() throws Exception {
+        DateDemo o = (DateDemo) input.readObject();
+        return o.getDate() == null;
+    }
 }
\ No newline at end of file
diff --git a/test_hessian/src/main/java/test/TestCustomReply.java b/test_hessian/src/main/java/test/TestCustomReply.java
index 21ada2a..83938da 100644
--- a/test_hessian/src/main/java/test/TestCustomReply.java
+++ b/test_hessian/src/main/java/test/TestCustomReply.java
@@ -23,6 +23,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.math.BigDecimal;
+import test.model.DateDemo;
 
 public class TestCustomReply {
 
@@ -346,6 +347,12 @@
         output.flush();
     }
 
+    public void customReplyTypedFixedDateNull() throws Exception {
+        DateDemo demo = new DateDemo("zhangshan",null);
+        output.writeObject(demo);
+        output.flush();
+    }
+
 }
 
 class TypedListTest implements Serializable {
diff --git a/test_hessian/src/main/java/test/model/DateDemo.java b/test_hessian/src/main/java/test/model/DateDemo.java
new file mode 100644
index 0000000..56fcb52
--- /dev/null
+++ b/test_hessian/src/main/java/test/model/DateDemo.java
@@ -0,0 +1,32 @@
+package test.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class DateDemo implements Serializable {
+    private String name;
+    private Date date;
+
+    public String getName() {
+        return name;
+    }
+
+    public DateDemo() {}
+
+    public DateDemo(String name,Date date) {
+        this.name = name;
+        this.date = date;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+}
\ No newline at end of file
