Как объявить свойство DateTime с правильным DateTimeKind? - PullRequest
1 голос
/ 21 апреля 2011

Я хочу что-то вроде этого:

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

Можно ли декларативно установить Kind таким образом? Что такое правильный синтаксис? У меня есть классы-заглушки для использования в моем веб-сервисе JSON WCF, и когда даты другого конца (Java-клиента) получают - все они любят:

123456000-0500

Где "-0500" - это мой часовой пояс, и если я выберу только левую часть, это будет неправильная дата UTC (я должен вычесть 5 часов). Я бы лучше исправил это на сервере.

РЕДАКТИРОВАТЬ :

  1. Я сохраняю все даты в базе данных (SQL Server) как UTC. Я никогда не имею дело с местными датами, за исключением случаев, когда нужно их отображать.

  2. У меня есть простой класс, который я передаю в качестве ответа в моей службе WCF - JSON. Когда я заполняю этот класс - я запрашиваю базу данных с EF и присваиваю значения этому классу.

  3. На клиенте, который является телефоном Android с Java - я использую библиотеку Gson для десериализации. Gson не может десериализовать формат WCF, поэтому я уже написал свой уродливый десериализатор так:

    открытый класс GsonDateDeserializer реализует JsonDeserializer { публичная дата десериализации (JsonElement json, тип typeOfT, контекст JsonDeserializationContext) выдает исключение 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»

Ответы [ 2 ]

0 голосов
/ 23 апреля 2011

Я закончил свою собственную функцию.Теперь при десериализации я учитываю часть часового пояса.

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

    }
0 голосов
/ 21 апреля 2011

Хорошо, эта дата является правильной ISO 8601 , поэтому другой конец должен ее принять.Если вы не можете это изменить или не хотите, вы можете сделать следующее:

private DateTime m_createdOn;
public DateTime CreatedOn
{
    get { return m_createdOn; }
    set { m_createdOn = value.ToUniversalTime(); }
}

РЕДАКТИРОВАТЬ: Вы имеете в виду, что дата с часовым поясом неверна?В этом случае вам, вероятно, следует позволить слою базы данных создать даты с правильными DateKind.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...