如何通过示例在C#中设置日期格式?

如何通过示例在C#中设置日期格式?,c#,.net,datetime,format,C#,.net,Datetime,Format,C#在为字符串表示形式格式化DateTime对象时提供了很大的灵活性,但是,要使用这种灵活性,必须知道所有格式字符串 如果您想以“Fri,June 24”的形式显示日期,可以这样做: DateTime someDate = DateTime.Now; Console.Write(someDate.ToString("ddd, MMMM dd")); 虽然这很好,但对于更复杂的格式来说很难,特别是对于第一次使用它的开发人员来说 我希望获得与上述代码返回的结果相同的结果,但是: DateTime

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"));

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

我认为这不可行,你怎么知道
12
是一天还是一年。我认为,阻碍歧义实际上比学习相对简单的自定义格式字符串更复杂


您是否曾经使用过VBA和日期?

通常我只是想知道正确的格式字符串应该是什么(在您的示例中是“ddd,MMMM dd”),然后将其作为常量存储在应用程序中的某个位置

public static class DateTimeFormats
{
    public string DayOfWeekMonthDay = "ddd, MMMM dd";
}
那你可以参考一下

DateTime.Now.ToString(DateTimeFormats.DayOfWeekMonthDay)

对这个问题的严格回答是:

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

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

我同意大多数受访者的观点,即这样做所需的努力与简单地记住已经提供的日期时间格式(或参考他们的文档)完全不成比例。但是,如果您确实进行了这样的努力,您将希望实现一个,并在需要时提供它的

有关示例,请参阅上面链接的ICustomFormatter文档,但您的任务将涉及提供
格式(字符串格式、对象arg、IFormatProvider formatProvider)
方法,该方法采用您感兴趣的格式的字符串,并使用它将在
arg
中传递的日期时间转换为与该模式匹配的字符串

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

DateTime someDate=DateTime.Now;
WriteLine(someDate.ToString(“6月12日星期三”,新的CustomDateFormatter());

我可以看出,对于较新的开发人员来说,这似乎更容易处理,但是在构建“从日期字符串开始的日期格式”函数时,有一些问题需要解决。我可以想象这样一个功能可能失败的场景,比如:

  • 你说“五月”;这是否意味着六月的日期应采用“六月”或“六月”格式
  • 你说“6月12日”;这是否意味着6月5日的格式应为“6月5日”或“6月5日”
现在,您可以向新开发人员解释,他们需要小心不要使用模棱两可的示例日期格式模板。但这需要他们已经理解它是如何模棱两可的。他们需要像格式化函数那样思考

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


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

在搜索了一段时间后,我找到了一个与我所寻找的完全相同的函数。因为我找不到.NET解决方案,所以受Ruby的启发,我实现了自己的实用程序

在github-上可以看到支持4种常见格式的峰值。我将此作为一个答案发布,以便对此类实用程序感兴趣的人可以从那里获得它,并在他们的项目中直接使用它

请注意,当前状态只是证明了一个点,是一个实验。没有进行单元测试。欢迎发表意见

一些实施说明:

NET framewok提供了一种非常好的方法,可以实现类型的自定义格式化程序和格式提供程序@djacobson在回答问题时提到了这一点。不幸的是,DateTime类的实现方式使您无法使用ICustomFormatter。使用自定义格式提供程序调用ToString()时,该格式提供程序必须返回DateTimeFormatInfo对象,DateTime类不会调用从格式提供程序返回的自定义格式设置程序


通过在DateTime类上实现一个自定义扩展方法,可以解决这个问题,该方法直接调用自定义格式化程序。图书馆的用户不必为这些细节费心。

我认为后一种方法根本不可读。这将如何计算dd/MM/yy和MM/dd/yyyy之间的差异?抱歉,但是
someDate。ToString(“ddd,MMMM dd”)
对我来说已经足够清楚了……我觉得你的方法很不直观-只需学习格式字符串,学习并不是那么难。@Slavo,学习这个框架所做的假设和不明确调用的默认值的精力不应该花在学习格式字符串上,或者如何查找它们上吗?我认为如果你只安排一天使用,它可能会起作用。特别是在你的图书馆里有一个特殊的日子,比如2011年9月12日,它不能以任何形式重叠。@Scorpi-你需要使用第13天和第32年来消除所有歧义-例如2032年9月13日。2011年12月11日仍然模棱两可。。。“是月初、日初还是年初?”加文·科茨我不知道该如何礼貌地说,所以我