【问题标题】:Custom DateTime formatting in c#c#中的自定义日期时间格式
【发布时间】:2012-11-30 12:13:12
【问题描述】:

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

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

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

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

有什么解决办法吗?

【问题讨论】:

  • 你想要的DateTime.Today字符串是什么?
  • 我希望它显示例如“1919,10,10 --.--.--”表示没有时间,“1919,10,10,12.43.10”表示有时间。
  • 只有在整个变量为空或者你分开一天中的时间时才可能做一些事情。时间“00:00:00”是有效时间(午夜),因此编译器不会将其解释为 null。如果您将一天中的时间分开,您可以在交易时进行检查 nil 或 00:00:00 并按照您想要的方式编写。

标签: c# string datetime string-formatting datetime-format


【解决方案1】:

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

String.Format(new MyFormatProvider(), "{0:d}, {0:T}", dateAndTimeVar);

然后,FormatProvider 将对除 T 之外的所有格式进行传递,如果 DateTime 的时间部分为00:00:00。

阅读 MSDN 上的 IFormatProvider here

【讨论】:

  • IFormatProvider 功能强大,但是却经常被忽略格式字符串的方面。人们倾向于认为提供的格式是固定不变的,但事实并非如此。
【解决方案2】:

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

DateTime.ToString() Patterns | GeekZilla

干杯

【讨论】:

  • 很遗憾,我无法更改模式。只有不变量。
  • 你能添加你想要的 printThis 变量的样子吗?
  • @drbaltar:所以您无法更改格式以获得正确的格式,但您想修改变量?这听起来很奇怪。
  • 好吧,我想我可以稍微改变一下格式,但唯一的输出改变应该是 --.--.-- 应该在没有时间的时候显示。
  • @TimSchmelter 这有什么奇怪的?也许在现实世界的代码中,格式字符串来自 24223 英里外的某个 UI 部门维护的已编译资源字符串。
【解决方案3】:

您可以简单地检查DateTime 是否包含时间:

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

【讨论】:

  • OP特别提到不能更改格式字符串
  • @PauliØsterø: 他commented: “我想我可以稍微改变一下格式,但唯一的输出改变应该是 --.--.-- 应该在没时间了。”
  • 是的,但总结提到它无法更改的总次数,而不是“可能”可以更改的次数,我认为最安全的赌注是它相当固定。
  • 感谢您的回答,很抱歉问题不清楚。不幸的是,我可能会更改格式字符串本身,而不是直接的逻辑。
  • @drbaltar:这使得它更加不清楚。您可以更改格式字符串(如我的回答所建议的那样),但您不能更改逻辑?周围的逻辑是什么,它被我的代码改变了吗?
【解决方案4】:

你可以这样做:

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

【讨论】:

  • 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);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多