如何用适当的DateTimeKind声明DateTime属性?

问题描述:

我想有这样的事情:如何用适当的DateTimeKind声明DateTime属性?

[Kind=DateTimeKind.Utc] 
public DateTime CreatedOn { get; set; } 

这是可以设置类声明这样呢?什么是正确的语法?我有存根类在我的JSON WCF web服务使用,并在另一端(Java客户端)获得的日期 - 他们都喜欢:

123456000-0500

其中“-0500”是我的时区,如果我只拿左边部分,那么它是不正确的UTC日期(我必须减去5小时)。我宁愿修复它在服务器上。

编辑

  1. 我保存的所有日期的数据库(SQL Server)作为UTC。除非需要显示它,否则我从不处理本地日期。

  2. 我有一个简单的类,我在我的WCF服务中传递响应 - JSON。当我填充这个类时 - 我用EF查询数据库并在这个类中赋值。

  3. 在客户端,这是与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”

+0

你想在服务器或客户端显示调整时间吗? – 2011-04-21 19:37:24

+0

我希望客户端收到123456000-0000 - 我不希望WCF将我的UTC日期(我从数据库中获取)传递给本地 – katit 2011-04-21 19:41:04

我最终完成了自己的功能。现在,当我反序列化时,我会考虑时区部分。

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创建日期。

+0

在主文章中查看我的编辑。我该如何告诉SQL Server是什么类型的?这只是DateTime,我总是在那里存储UTC日期。 – katit 2011-04-21 19:56:44