我想有这样的东西:
[Kind=DateTimeKind.Utc]
public DateTime CreatedOn { get; set; }
可以像那样声明式地设置Kind吗?什么是正确的语法?我在JSON WCF Webservice中使用存根类,当其他端(Java客户端)获得日期时,它们都像:
123456000 - 0500其中"-0500"是我的时区,如果我只取左边的部分,那么它不是正确的UTC日期(我必须减去5小时)。我宁愿在服务器上修复它。
编辑:
我将数据库(SQL Server)中的所有日期保存为UTC。我从来不处理本地日期,除非需要显示它。
我有一个简单的类,我传递作为响应在我的WCF服务- JSON。当我填充这个类时,我用EF查询数据库并在这个类中赋值。
在客户端,Android手机,Java -我使用Gson库反序列化。Gson不能反序列化WCF格式,所以我已经写了一个丑陋的反序列化器,像这样:
公共类GsonDateDeserializer实现了JsonDeserializer{public Date deserialize(JsonElement json, Type typepeoft, JsonDeserializationContext)抛出JsonParseException{String = json.getAsString();s = s.replace("/Date(", ");S = S .replace(")/", ");//if there us no data passed in - that means NULL if (s.equals("")) return null; //If we got timezone info with this date - cut it off if (s.length() > 5 && (s.indexOf("-") == s.length()-5 || s.indexOf("+") == s.length()-5)) { s = s.substring(0, s.length()-5); } Long l = Long.valueOf(s); return new Date(l); }
}
我认为WCF传递"-0500"仅用于信息,以便客户端知道应该转换为哪个时区。但是没有。它通过左边的数字加上5个小时。所以,我不希望服务器是"智能的"我只想让它以"-0000"传递所有日期
这个日期是一个合适的ISO 8601,所以另一端应该接受它。如果你不能改变,或者你不想改变,你可以这样做:
private DateTime m_createdOn;
public DateTime CreatedOn
{
get { return m_createdOn; }
set { m_createdOn = value.ToUniversalTime(); }
}
EDIT:你的意思是时区的日期是错误的?在这种情况下,您可能应该让数据库层使用适当的DateKind
创建日期。
我最终完成了自己的函数。现在,当我反序列化时,我会考虑时区部分。
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
String s = json.getAsString().replace("/Date(", "").replace(")/", "");
//if there us no data passed in - that means NULL
if (s.equals("")) return null;
//If we got timezone info handle separately:
long offset = 0;
if (s.length() > 5 && (s.indexOf("-") == s.length()-5 || s.indexOf("+") == s.length()-5))
{
//get offset minutes
offset = Long.valueOf(s.substring(s.length()-4, s.length()-2))*60 + Long.valueOf(s.substring(s.length()-2, s.length()));
//Apply direction
if (s.indexOf("-") == s.length()-5) offset = -offset;
//Cutoff offset
s = s.substring(0, s.length()-5);
}
return new Date(Long.valueOf(s) + offset * 60 * 1000);
}