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



我想有这样的东西:

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

可以像那样声明式地设置Kind吗?什么是正确的语法?我在JSON WCF Webservice中使用存根类,当其他端(Java客户端)获得日期时,它们都像:

123456000 - 0500

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

编辑:

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

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

  3. 在客户端,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);
    }

相关内容

  • 没有找到相关文章

最新更新