基于https://forums.adobe.com/thread/1076594 的 Blaze DS / Adobe LiveCycle DS 解决方案:
服务配置.xml
<service id="myProxyBootstrapService" class="org.myapp.flex.proxy.MyProxyBootstrapService"/>
MyProxyBootstrapService.java
MyProxyBootstrapService extends AbstractBootstrapService {
@Override
public void initialize(String arg0, ConfigMap arg1) {
PropertyProxyRegistry registry = PropertyProxyRegistry.getRegistry();
registry.register(Serializable.class, new DateProxy());
}
DateProxy.java
public class DateProxy extends BeanProxy {
private static final long serialVersionUID = 8097540028987261941L;
private Integer serverOffset;
public DateProxy() {
super();
}
@Override
public Object getValue(Object instance, String propertyName) {
Object result = super.getValue(instance, propertyName);
if (result instanceof Date) {
result = toDate(result, true);
}
return result;
}
@Override
public void setValue(Object object, String propertyName, Object value) {
if (value instanceof Date) {
Date date = toDate(value, false);
super.setValue(object, propertyName, date);
} else {
super.setValue(object, propertyName, value);
}
}
private Date toDate(Object value, Boolean serverToClient) {
Date date = (Date) value;
Integer clientOffset = getClientOffset();
Integer serverOffset = getServerOffset();
if (clientOffset != null && !clientOffset.equals(serverOffset)) {
Calendar cal = new GregorianCalendar(TimeZone.getDefault());
cal.setTime(date);
cal.add(Calendar.MINUTE, serverToClient ? clientOffset - serverOffset : serverOffset - clientOffset);
date.setTime(cal.getTimeInMillis());
}
return date;
}
private Integer getClientOffset() {
return (Integer) FlexContext.getFlexSession().getAttribute("TIMEZONE_FLEX_OFFSET");
}
private Integer getServerOffset() {
if (serverOffset == null) {
serverOffset = Calendar.getInstance().getTimeZone().getOffset(new Date().getTime()) / 1000 / 60 * -1;
}
return serverOffset;
}