Spring Controller将时间转换为它的Local TimeZone

时间:2014-04-17 12:08:15

标签: spring hibernate spring-mvc jpa

我有Spring rest服务项目,我正在使用JPA hibernate,我在控制器中面临一个奇怪的问题。以下是代码段:

控制器:

@RequestMapping(method = RequestMethod.POST, value=PATH_SEPERATOR+ CREATE_OR_UPDATE_EVENT_METHOD,  headers = ACCEPT_APPLICATION_JSON, produces = APPLICATION_JSON)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
ResponseBean createOrUpdateEvent(@RequestBody Event eventBean)
{   
    ResponseBean  response = new ResponseBean();
    try {

        String sysId = eventService.createOrUpdateEvent(eventBean);
        response.setStatus(OK);
        response.setData(sysId);

    } catch(Exception ex) {

        response = handleException(CREATE_OR_UPDATE_EVENT_METHOD, ex);
        return response;
    } 
    return response;

}  

Event.java

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "sysId", scope = Event.class)
@Table(name = "event")
public class Event {  

@Column(name = "date_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private Date dateTime;  

public Date getDateTime() {
    return dateTime;
}

public void setDateTime(Date dateTime) {
    this.dateTime = dateTime;
}
}  

当我将createOrUpdateEvent方法中的日期作为字符串“2014-04-17T17:15:56”(在IST时区中)传递给Event bean时,控制器将其转换为Date with datetime“2014-04-17T22 :45:56“IST考虑以前的时间作为UTC时间。我不明白这种自动转换的行为。我认为这是因为我接受参数为bean,其中bean是JPA Entity。请帮我修理一下。

1 个答案:

答案 0 :(得分:1)

您必须考虑几件事情。首先,您缺少所提供的JSON序列化格式的时区信息" yyyy-MM-dd' HH:mm:ss"。有一个格式字符可以添加它 - Z.使用它应该像" yyyy-MM-dd' H&H; mm:ssZ"取决于您的喜好。您应该考虑的另一件事是java.util.Date不能识别TimeZone,而且当您创建一个新的Date(long)时,它总是假定传递的日期在当前时区。

因此,为了解决这个问题,您必须像我告诉你的那样添加(并传递)时区,Json解析器将完成剩下的工作。