如何在c#中格式化日期的示例

本文关键字:日期 格式化 | 更新日期: 2023-09-27 18:01:15

c#在为字符串表示格式化DateTime对象时提供了很大的灵活性,但是,必须了解所有格式字符串才能使用这种灵活性。

如果您想以"Fri, June 24"的形式显示日期,您可以这样做:

DateTime someDate = DateTime.Now;
Console.Write(someDate.ToString("ddd, MMMM dd"));

虽然这工作得很好,但对于更复杂的格式来说很难,特别是对于第一次使用它的开发人员。

我想获得与上面代码相同的返回结果,但使用以下方式:

DateTime someDate = DateTime.Now;
Console.WriteLine(someDate.ToString("Wed, June 12"));

作为字符串指定的日期可以是任意的。从本质上讲,格式必须首先以某种方式解析日期来确定。我知道这种方法有局限性(本地化是其中之一),但对于简单的场景来说,它更容易理解。除了我自己执行之外,还有什么方法可以做到吗?我愿意使用第三方库。

如何在c#中格式化日期的示例

通常我只是找出正确的格式字符串应该是什么(在您的示例"ddd, MMMM dd"),然后将其存储为应用程序中的某个常量…

public static class DateTimeFormats
{
    public string DayOfWeekMonthDay = "ddd, MMMM dd";
}

那么你可以直接引用它

DateTime.Now.ToString(DateTimeFormats.DayOfWeekMonthDay)

我可以看到这对于新开发人员来说似乎更容易使用,但是在构建"日期字符串格式"函数时需要解决一些问题。我可以想象这样的函数可能失败的场景,比如:

  • 你说"May";这是否意味着日期在六月应该格式化为"Jun"或"June"?
  • 你说"6月12日";这是否意味着June 5th应该格式化为"June 5"或"June 05"?

现在,您可以向新开发人员解释,他们需要小心不要使用模棱两可的示例日期格式模板。但是这需要他们已经理解为什么是不明确的。他们需要像格式化函数那样思考。

这就是为什么日期格式字符串是按原样定义的——尽可能具体地描述开发人员想要/需要生成的所需输出格式。它们最大程度地防止了这种模糊性。

如果开发人员最终需要"像格式化函数一样思考"来获得他们想要的东西,那么可能值得花时间学习现有的定义。

这个问题的严格答案是:

除了……之外,还有别的方法吗自己实现它?我愿意使用第三方库

为否,除非第三方已经这样做了,否则您需要实现自己的格式字符串解析器。

我同意大多数受访者的观点,即这样做所需的努力与简单地记住已经提供的DateTime格式(或参考他们的文档)的替代方法完全不成比例。但是,如果您确实进行了这样的工作,您将希望实现一个ICustomFormatter,以及一个在请求时提供它的IFormatProvider。

请参阅上面链接的ICustomFormatter文档中的示例,但您的任务将涉及提供一个Format(string format, object arg, IFormatProvider formatProvider)方法,该方法接受您感兴趣的格式的字符串,并使用它将arg中传递的DateTime转换为匹配该模式的字符串。

完成后,您有一个IFormatProvider,其GetFormat()方法返回您的自定义格式化程序,您的示例代码将如下所示:

DateTime someDate = DateTime.Now;
Console.WriteLine(someDate.ToString("Wed, June 12", new CustomDateFormatter()));

我不认为这可以工作,你怎么知道如果12是一天或一年。我认为潜在的歧义实际上比学习相对简单的自定义格式字符串要复杂得多。

你曾经使用过VBA和日期吗?

在搜索了一段时间后,我设法找到了一个Ruby库,它做了与我正在寻找的完全相同的事情。由于我无法找到。net解决方案,我受Ruby的启发实现了自己的实用程序。

支持4种常见格式的spike可以在github - Stamp.Net上看到。我把这篇文章作为一个答案,这样对这种实用程序感兴趣的人就可以从那里得到它,并直接在他们的项目中使用它。

请注意,目前的状态只是证明了一个观点,是一个实验。没有进行单元测试。欢迎您的评论。

一些实现注意事项:

. net框架提供了一种很好的方式来实现自定义格式化器和类型的格式提供程序。@djacobson在回答问题时提到了这一点。不幸的是,DateTime类的实现方式使您无法与它一起使用ICustomFormatter。当你用自定义格式提供程序调用ToString()时,该格式提供程序必须返回一个DateTimeFormatInfo对象,并且DateTime类不会调用从格式提供程序返回的自定义格式化程序。

这已经通过在DateTime类上实现一个自定义扩展方法来解决,该方法直接调用自定义格式化器。该库的用户不需要为这些细节而烦恼。