如何用适当的DateTimeKind声明DateTime属性?
我想有这样的事情:如何用适当的DateTimeKind声明DateTime属性?
[Kind=DateTimeKind.Utc]
public DateTime CreatedOn { get; set; }
这是可以设置类声明这样呢?什么是正确的语法?我有存根类在我的JSON WCF web服务使用,并在另一端(Java客户端)获得的日期 - 他们都喜欢:
123456000-0500
其中“-0500”是我的时区,如果我只拿左边部分,那么它是不正确的UTC日期(我必须减去5小时)。我宁愿修复它在服务器上。
编辑:
我保存的所有日期的数据库(SQL Server)作为UTC。除非需要显示它,否则我从不处理本地日期。
我有一个简单的类,我在我的WCF服务中传递响应 - JSON。当我填充这个类时 - 我用EF查询数据库并在这个类中赋值。
-
在客户端,这是与Java的Android手机 - 我使用Gson库反序列化。 GSON无法反序列化WCF格式,所以我已经写我的丑解串器是这样的:
公共类GsonDateDeserializer实现JsonDeserializer { 公开日期反序列化(JsonElement JSON,类型typeOfT,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”
我最终完成了自己的功能。现在,当我反序列化时,我会考虑时区部分。
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);
}
那么,该日期是一个合适的ISO 8601,所以另一端应该接受它。如果你不能改变这种状况,或者你不想,你可以做到以下几点:
private DateTime m_createdOn;
public DateTime CreatedOn
{
get { return m_createdOn; }
set { m_createdOn = value.ToUniversalTime(); }
}
编辑:你的意思时区的日期是错误的?在这种情况下,您应该让数据库层使用正确的DateKind
创建日期。
在主文章中查看我的编辑。我该如何告诉SQL Server是什么类型的?这只是DateTime,我总是在那里存储UTC日期。 – katit 2011-04-21 19:56:44
你想在服务器或客户端显示调整时间吗? – 2011-04-21 19:37:24
我希望客户端收到123456000-0000 - 我不希望WCF将我的UTC日期(我从数据库中获取)传递给本地 – katit 2011-04-21 19:41:04