Как изменить формат универсальной сортировки DateTime в .NET? - PullRequest
2 голосов
/ 22 сентября 2009

Мы пытаемся заставить наши объекты datetime в c # сериализовать, используя другой формат, чем по умолчанию. Мы не хотим включать миллисекунды. SortableDateTimePattern и UniversalSortableDateTimePattern доступны только для чтения.

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Предполагая, что вы говорите об экземплярах DateTime в DataContract, отправляемых сервером, я не думаю, что существует простой способ сделать это. Упомянутые вами шаблоны не используются (если бы они были, вы могли бы просто взломать экземпляр общего шаблона с помощью отражения для грубого, но простого решения). В конечном итоге DataContractSerializer делегирует задачу внутреннему методу XsdDateTime.ToString (), который жестко задан, чтобы всегда выдавать дробные секунды, если они ненулевые.

Это не элегантно, но использование жестко запрограммированного поведения может быть самым простым решением: просто скопируйте все ваши DateTimes, сбросив миллисекунды до нуля, прежде чем они покинут сервер.

Кроме того, вы можете подключить пользовательский IDispatchMessageFormatter или IDispatchMessageInspector к затронутым операциям. Также нельзя прогуляться по парку, если вы хотите, чтобы они были общими и их легко было подключить.

Просто любопытно - у вас плохо себя ведет клиент, который не понимает доли секунды?

0 голосов
/ 25 сентября 2009

Я нашел несколько способов справиться с этой проблемой. Более сложные методы включают перехват пользовательской конечной точки MessageFormatter.

Мы нашли простой способ это сделать.

Доли секунд генерируются, только если они есть у объекта datetime.

Что мы сделали:

Мы создали обработчик событий static on propertychange, который использует отражение для обнаружения типов данных datetime. Найдя, мы воссоздаем дату и время без доли секунд. В нашем случае нас не заботили секунды. Мы связываем событие в частичном конструкторе класса. Вот и все.

Конечно

public static class DateTimeSecondCatcher
{
    PropertyInfo dateTimePropertyInfo = sender.GetType().GetProperty(e.PropertyName);
        if ((dateTimePropertyInfo != null) && (dateTimePropertyInfo.PropertyType == typeof(DateTime)))
        {

            DateTime dteValue = (DateTime)dateTimePropertyInfo.GetValue(sender, null);
            if (dteValue.Millisecond > 0)
            {
                dateTimePropertyInfo.SetValue(sender, new DateTime(dteValue.Year,dteValue.Month,dteValue.Day, dteValue.Hour,dteValue.Minute,dteValue.Second,0,dteValue.Kind), null);
            }
        }

}


// This code goes in the partial class constructor
this.PropertyChanged += new PropertyChangedEventHandler(DateTimeSecondCatcher.OnPropertyChanged);
...