C# c语言中的自定义日期时间格式#

C# c语言中的自定义日期时间格式#,c#,string,datetime,string-formatting,datetime-format,C#,String,Datetime,String Formatting,Datetime Format,我有一个使用以下字符串格式打印的变量: var printThis = String.Format("{0:d}, {0:T}", dateAndTimeVar); 现在我有一个问题;当我没有将任何时间设置为“dateAndTimeVar”时,我需要“{0:T}”来显示类似于“-.--.”的内容。这似乎不支持使用常规日期时间类型(如果没有时间设置,则默认显示“00.00.00”) 我可以将'dateAndTimeVar'变量更改为任何类型(包括其他类型),但字符串格式必须保持不变 有什么解决办

我有一个使用以下字符串格式打印的变量:

var printThis = String.Format("{0:d}, {0:T}", dateAndTimeVar);
现在我有一个问题;当我没有将任何时间设置为“dateAndTimeVar”时,我需要“{0:T}”来显示类似于“-.--.”的内容。这似乎不支持使用常规日期时间类型(如果没有时间设置,则默认显示“00.00.00”)

我可以将'dateAndTimeVar'变量更改为任何类型(包括其他类型),但字符串格式必须保持不变


有什么解决办法吗?

这是一个可以使用的日期时间模式列表


干杯

您需要创建自己的IFormatProvider并将其传递到String.Format方法中,如下所示

String.Format(new MyFormatProvider(), "{0:d}, {0:T}", dateAndTimeVar);
然后,FormatProvider将对除T之外的所有格式进行传递,在这里,您将拥有用于输出DateTime的本机T格式的逻辑,或者如果DateTime的时间部分是00:00:00,则输出--.--


在MSDN上阅读有关IFormatProvider的信息

您只需执行以下操作:

var printThis = String.Format("{0:d}, {0:T}", dateAndTimeVar)
                      .Replace("00:00:00", "--.--.--");

您只需检查
DateTime
是否包含时间:

String printThis = dateAndTimeVar.Date == dateAndTimeVar ?  
    String.Format("{0:d}, --.--.--", dateAndTimeVar) : 
    String.Format("{0:d}, {0:T}", dateAndTimeVar);

不幸的是,我无法改变这种模式。只有in-variable。您能完整地添加您想要打印的内容吗?@drbaltar:所以您不能更改格式以获得正确的格式,而是要修改变量?这听起来真的很奇怪。我想我可以稍微改变一下格式,但唯一的输出变化应该是--.--应该在没有时间的时候显示出来。@TimSchmelter有什么奇怪的?可能在现实世界的代码中,格式字符串来自24223英里以外的某个UI部门维护的已编译资源字符串。
DateTime的所需字符串是什么。今天
?我希望它在没有时间时显示例如“1919,10,10--.”和“1919,10,10,12.43.10”只有当整个变量为null或将一天中的时间分隔开时,才能执行类似操作。时间“00:00:00”是有效时间(午夜),因此编译器不会将其解释为null。如果你把一天中的时间分开,你可以在交易为零或是00:00:00时进行检查,并按照你想要的方式写入。OP特别提到,格式字符串不能为空changed@PauliØsterø:他:“嗯,我想我可以稍微改变一下格式,但唯一的输出变化应该是--.--应该在没有时间的时候显示。”是的,但是总结一下总次数,它是不能改变的,与它“可能”是可以改变的相比,我认为最安全的赌注是它是相当固定的。谢谢你的回答,很抱歉这个问题不清楚。不幸的是,我可能会更改格式字符串本身,而不是它周围的直接逻辑。@drbaltar:这使得它更加不清楚。您可以更改格式字符串(如我的回答中所建议的),但您不能更改周围的逻辑?它的逻辑是什么,是否被我的代码改变了?IFormatProvider功能强大,但常常忽略了格式字符串的这一方面。人们倾向于认为所提供的格式是固定的,是一成不变的,这肯定不是case.String.Format(“{0:d},{0:T}”,dateAndTime.GetValue());生成1919,10,10,1919,10,10,1919,10,10,1919,10,10:\Ok修改为将格式字符串作为参数传递。您可以直接打印返回值。谢谢,不幸的是我不能直接打印-该值必须经过String.Format(“{0:d},{0:t}”,theValue);