我们有一个从字母数字字符串获取日期的方法.假设字符串是Y04051000547GF
,则结果日期将是Tue May 04 00:00:00 IST 2010
.
public static Date getDateFromGITID(String gitId) {
Date date = null;
try {
String dateInGit = nid.substring(1, 7); // six characters from the second character
DateFormat format = new SimpleDateFormat("ddMMyy", Locale.ENGLISH);
date = format.parse(dateInGit);
} catch (ParseException e) {
}
return date;
}
现在,这个日期被分配给一个类UserInfo
的属性,当我们try 将这个类的对象转换为JSON时,日期会递减1天!
Object to JSON string个
public static String asJsonString(final Object obj) {
try {
return new ObjectMapper().writeValueAsString(obj);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
User Info Bean个
public class UserInfo {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
Date date;
}
这是主要的方法
public static void main(String[] args) {
UserInfo obj = new UserInfo();
obj.date = getDateFromGITID("Y04051000547GF");
System.out.println(obj.date);
System.out.println(asJsonString(obj));
}
这是控制台的输出
Tue May 04 00:00:00 IST 2010
{"dob":"2010-05-03"}
您可以看到日期是2010年5月4日,但在JSON中它会减少1天.我们能够找出导致问题的原因,日期打印在IST,与UST相差5小时30分钟.因此,我们添加了JSON转换之前的时间,转换后的时间没有变化.
public static void main(String[] args) {
UserInfo obj = new UserInfo();
obj.dob = getDOBFromNID("Y04051000547GF");
System.out.println(obj.dob);
obj.dob.setHours(5);
obj.dob.setMinutes(30);
obj.dob.setSeconds(00);
System.out.println(asJsonString(obj));
}
Output个
Tue May 04 00:00:00 IST 2010
{"dob":"2010-05-04"}
是的,我们使用了不推荐使用的方法,但它仅用于测试.即使我们try 将时间减少1秒,问题也会出现.
Edit-1 (Found another fix by setting the time zone to the formatter)个
当我们将getDateFromGITID
方法中DateFormat
的时区设置为GST(Java SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") gives timezone as IST)时,我们能够以另一种方式修复此问题.
format.setTimeZone(TimeZone.getTimeZone("GMT"));
所以问题是
- 为什么会发生这种事?
- 第二种方式是更好的解决办法吗?
- 有没有其他更好的解决办法?