如何使用正确的DateTimeKind声明DateTime属性?

时间:2011-04-21 19:29:35

标签: c# datetime timezone

我希望有这样的东西:

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

这可以像那样以声明方式设置Kind吗?什么是正确的语法?我有我的JSON WCF Web服务中使用的存根类,当其他端(Java客户端)获取日期时 - 他们都喜欢:

123456000-0500

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

编辑

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

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

  3. 在客户端上,这是带有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);
    
    }
    

    }

  4. 我认为WCF只传递“-0500”以获取信息,因此客户端知道它应转换为哪个时区。但不是。它传递左边的数字,加上5个小时。所以,我不希望服务器“聪明”,只是希望它将所有日期传递为“-0000”

2 个答案:

答案 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);

    }