我们试图强制 c# 中的日期时间对象使用与默认格式不同的格式进行序列化。我们不想包括毫秒。SortableDateTimePattern 和 UniversalSortableDateTimePattern 是只读的。
2 回答
假设您正在谈论由服务器发送的 DataContract 中的 DateTime 实例,我认为没有直接的方法可以做到这一点。您提到的模式没有被使用(如果它们被使用,您可以通过反射来破解共享模式实例以获得粗略但简单的解决方案)。DataContractSerializer 最终将任务委托给内部 XsdDateTime.ToString() 方法,该方法经过硬编码以始终发出非零的小数秒。
这并不优雅,但利用硬编码行为可能是最简单的解决方案:只需复制所有日期时间,在它们离开服务器之前将毫秒重置为零。
或者,您需要在受影响的操作上连接自定义 IDispatchMessageFormatter 或 IDispatchMessageInspector。如果您希望它们通用且易于连接,那么在公园散步也不是。
只是好奇-您是否有不了解小数秒的行为不端的客户端?
我想出了一些方法来处理这个问题。更复杂的方法涉及挂钩自定义 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);