Как изменить универсальный формат сортировки DateTime в .NET?

StackOverflow https://stackoverflow.com/questions/1457345

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

Доли секунд генерируются только в том случае, если они есть у объекта 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top