2

我们试图强制 c# 中的日期时间对象使用与默认格式不同的格式进行序列化。我们不想包括毫秒。SortableDateTimePattern 和 UniversalSortableDateTimePattern 是只读的。

4

2 回答 2

1

假设您正在谈论由服务器发送的 DataContract 中的 DateTime 实例,我认为没有直接的方法可以做到这一点。您提到的模式没有被使用(如果它们被使用,您可以通过反射来破解共享模式实例以获得粗略但简单的解决方案)。DataContractSerializer 最终将任务委托给内部 XsdDateTime.ToString() 方法,该方法经过硬编码以始终发出非零的小数秒。

这并不优雅,但利用硬编码行为可能是最简单的解决方案:只需复制所有日期时间,在它们离开服务器之前将毫秒重置为零。

或者,您需要在受影响的操作上连接自定义 IDispatchMessageFormatter 或 IDispatchMessageInspector。如果您希望它们通用且易于连接,那么在公园散步也不是。

只是好奇-您是否有不了解小数秒的行为不端的客户端?

于 2009-09-22T10:41:20.787 回答
0

我想出了一些方法来处理这个问题。更复杂的方法涉及挂钩自定义 MessageFormatter 端点。

我们找到了一个简单的方法来做到这一点。

仅当 datetime 对象具有秒数时才会生成分数。

我们做了什么:

我们创建了一个静态 on propertychange 事件处理程序,它使用反射来检测日期时间数据类型。找到后,我们重新创建日期时间而没有秒数。在我们的例子中,我们根本不关心秒数。我们将事件连接到部分类构造函数中。而已。

当然

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);
于 2009-09-24T21:49:34.317 回答