我希望有这样的东西:
[Kind=DateTimeKind.Utc]
public DateTime CreatedOn { get; set; }
这可以像那样以声明方式设置Kind吗?什么是正确的语法?我有我的JSON WCF Web服务中使用的存根类,当其他端(Java客户端)获取日期时 - 他们都喜欢:
123456000-0500
其中“-0500”是我的时区,如果我只选择左侧部分那么它的UTC日期不正确(我必须减去5小时)。我宁愿在服务器上修复它。
编辑:
我将数据库(SQL Server)中的所有日期保存为UTC。除非需要显示,否则我从不处理当地日期。
我有一个简单的类,我在WCF服务中作为响应传递--JSON。当我填充这个类时 - 我用EF查询数据库并在这个类中分配值。
在客户端上,这是带有Java的Android手机 - 我使用Gson库进行反序列化。 Gson无法反序列化WCF格式,所以我已经写了这样丑陋的反序列化器:
public class GsonDateDeserializer实现了JsonDeserializer { public Date反序列化(JsonElement json,Type typeOfT,JsonDeserializationContext context)抛出JsonParseException { String s = 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”
答案 0 :(得分:0)
那么,那个日期是正确的ISO 8601,所以另一端应该接受它。如果您无法更改,或者您不想更改,则可以执行以下操作:
private DateTime m_createdOn;
public DateTime CreatedOn
{
get { return m_createdOn; }
set { m_createdOn = value.ToUniversalTime(); }
}
编辑:您的意思是带有时区的日期有误吗?在这种情况下,您可能应该让数据库层使用正确的DateKind
创建日期。
答案 1 :(得分:0)
我最终完成了自己的功能。现在当我反序列化时,我考虑了时区部分。
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);
}