有没有办法从Web服务返回的Java Date对象中删除时区组件?
例如我的开始日期是12AM。我希望将其用作客户端当地时间的上午12点。
我认为如果soap消息没有时区组件,则使用本地时区。我还有两个其他选项可以在客户端进行算术运算(我真的不想做)或者创建一个新的日期类,将日,月和年保持为整数(我不需要时间信息)。后一种选择需要大量的重构,所以如果有办法在soap消息中切掉时区信息,那将是更好的选择。
客户端是用.NET编写的,所以如果有办法改变在客户端解释日期的方式,我会想到实现相同的目标。
答案 0 :(得分:2)
我相信我找到了解决问题的方法。我使用@XmlJavaTypeAdapter来更改日期类封送到Xml的方式。
这是我使用的DateAdapter。
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class DateAdapter extends XmlAdapter<String, Date> {
// the desired format
private String pattern = "yyyy-MM-dd";
public String marshal(Date date) throws Exception {
return new SimpleDateFormat(pattern).format(date);
}
public Date unmarshal(String dateString) throws Exception {
return new SimpleDateFormat(pattern).parse(dateString);
}
}
我在所有我想要使用“yyyy-MM-dd”日期格式的getter上使用了以下注释。
@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
答案 1 :(得分:1)
Java Date
个对象没有拥有时区组件。它们根本没有时区概念:自1970年1月1日午夜起,它们总是只有几毫秒。
我不太了解日期和时间的SOAP表示...如果你可以说服 date 是你需要的(而不是日期和时间)你可能没问题。否则,我建议您在UTC中执行所有操作,但将视为客户端上的本地时间。如果您只处理日期,这不应该太糟糕 - 尽管您确实需要考虑午夜并不总是发生在每个时区的每个日期,或者它可能会发生两次。 ..
基本上遗憾的是.NET和Java都没有一个像样的内置日期和时间API。在Java上Joda Time,您希望通过它的声音使用LocalDate
来表示完全您感兴趣的内容(当地时区的日期)。在.NET上,将(最终)成为Noda Time但尚未准备就绪。即使这两者都存在于各自的基础平台中,您仍然需要说服SOAP对其进行适当的序列化:(