Skip to content

Commit 3af47d8

Browse files
Fix for Date formatting not including timezone #149
1 parent 17d2de6 commit 3af47d8

File tree

4 files changed

+120
-4
lines changed

4 files changed

+120
-4
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.ibm.watson.developer_cloud.util;
2+
3+
import java.lang.reflect.Type;
4+
import java.text.ParseException;
5+
import java.text.SimpleDateFormat;
6+
import java.util.Date;
7+
import java.util.logging.Level;
8+
import java.util.logging.Logger;
9+
10+
import com.google.gson.JsonDeserializationContext;
11+
import com.google.gson.JsonDeserializer;
12+
import com.google.gson.JsonElement;
13+
import com.google.gson.JsonParseException;
14+
15+
public class DateDeserializer implements JsonDeserializer<Date> {
16+
private static final String DATE_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSS";
17+
private static final String DATE_WITHOUT_SECONDS = "yyyy-MM-dd'T'HH:mm:ssZ";
18+
private static final SimpleDateFormat utc = new SimpleDateFormat(DATE_UTC);
19+
private static final SimpleDateFormat utcWithoutSec = new SimpleDateFormat(DATE_WITHOUT_SECONDS);
20+
21+
private static final Logger log = Logger.getLogger(DateDeserializer.class.getName());
22+
23+
@Override
24+
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
25+
throws JsonParseException {
26+
27+
String dateAsString = json.getAsJsonPrimitive().getAsString();
28+
dateAsString = dateAsString.replaceAll("Z$", "+0000");
29+
try {
30+
return utc.parse(dateAsString);
31+
} catch (Exception e1) {
32+
try {
33+
return utcWithoutSec.parse(dateAsString);
34+
} catch (ParseException e2) {
35+
log.log(Level.SEVERE, "Error parsing: " + dateAsString, e2);
36+
}
37+
}
38+
return null;
39+
}
40+
41+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.ibm.watson.developer_cloud.util;
2+
3+
import java.lang.reflect.Type;
4+
import java.text.SimpleDateFormat;
5+
import java.util.Date;
6+
7+
import com.google.gson.JsonElement;
8+
import com.google.gson.JsonPrimitive;
9+
import com.google.gson.JsonSerializationContext;
10+
import com.google.gson.JsonSerializer;
11+
12+
/**
13+
* DateSerializer
14+
*/
15+
public class DateSerializer implements JsonSerializer<Date> {
16+
private static final String DATE_FORMAT_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
17+
18+
/*
19+
* (non-Javadoc)
20+
*
21+
* @see com.google.gson.JsonSerializer#serialize(java.lang.Object, java.lang.reflect.Type,
22+
* com.google.gson.JsonSerializationContext)
23+
*/
24+
@Override
25+
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
26+
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_UTC);
27+
28+
return src == null ? null : new JsonPrimitive(sdf.format(src));
29+
}
30+
31+
}

src/main/java/com/ibm/watson/developer_cloud/util/GsonSingleton.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
package com.ibm.watson.developer_cloud.util;
1515

16+
import java.util.Date;
17+
1618
import com.google.gson.Gson;
1719
import com.google.gson.GsonBuilder;
1820

@@ -22,17 +24,22 @@
2224
*/
2325
public class GsonSingleton {
2426

25-
private static final String DATE_FORMAT_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSS";
2627
private static Gson gson;
2728

2829
/**
2930
* Creates a {@link com.google.gson.Gson} object that can be use to serialize and deserialize Java
30-
* objects}
31+
* objects
3132
*
32-
* @return the Gson
33+
* @return the {@link Gson}
3334
*/
3435
private static Gson createGson() {
35-
return new GsonBuilder().setPrettyPrinting().setDateFormat(DATE_FORMAT_UTC).create();
36+
GsonBuilder builder = new GsonBuilder().setPrettyPrinting();
37+
38+
// Date serializer and deserializer
39+
builder.registerTypeAdapter(Date.class, new DateDeserializer());
40+
builder.registerTypeAdapter(Date.class, new DateSerializer());
41+
42+
return builder.create();
3643
}
3744

3845
/**
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.ibm.watson.developer_cloud.util;
2+
3+
import java.lang.reflect.Type;
4+
import java.util.ArrayList;
5+
import java.util.Date;
6+
import java.util.List;
7+
8+
import org.junit.Assert;
9+
import org.junit.Test;
10+
11+
import com.google.gson.reflect.TypeToken;
12+
13+
/**
14+
* Test the {@link GsonSingleton} class used to transform from and to JSON
15+
*/
16+
public class GsonSingletonTest {
17+
Type listType = new TypeToken<ArrayList<Date>>() {}.getType();
18+
19+
/**
20+
* Test the date serializer and deserializer
21+
*/
22+
@Test
23+
public void testDateSerializer() {
24+
String dateAsJson =
25+
"[\"2014-06-04T15:38:07Z\"," + "\"2015-08-24T18:42:25.324Z\","
26+
+ "\"2015-08-24T18:42:25.324Z\"," + "\"2015-08-31T00:49:27.77Z\","
27+
+ "\"2015-09-01T16:05:30.058-0400\"," + "\"2015-09-01T16:05:30.058-0400\","
28+
+ "\"2015-09-01T16:05:30.058-0400\"," + "\"2015-09-01T16:05:30.058-0400\","
29+
+ "\"2015-10-08T17:59:39.609Z\"]";
30+
31+
List<Date> dates = GsonSingleton.getGson().fromJson(dateAsJson, listType);
32+
Assert.assertNotNull(dates);
33+
34+
String datesAsString = GsonSingleton.getGson().toJson(dates);
35+
Assert.assertNotNull(datesAsString);
36+
}
37+
}

0 commit comments

Comments
 (0)