【问题标题】:Should I use ToString() or GetDateTimeFormats() to format a DateTime?我应该使用 ToString() 还是 GetDateTimeFormats() 来格式化 DateTime?
【发布时间】:2013-08-26 04:19:36
【问题描述】:

我知道如何将DateTime 格式化为String。可能有很多方法可以将DateTime 格式化为String,我发现与DateTime 格式化相关的问题很少。

但我找到并尝试了两种方法:

  1. GetDateTimeFormats()
  2. ToString("MM/dd/yyyy")

我试过这段代码:

public static class DateTimeFormates
{
    public static string FormatMyDate(this DateTime DT)
    {
        // My Actual Date Time Comes in this Format
        //8/23/2013 12:43:12 PM

        // I'm expecting Format like below

        String FormatWayOne = DT.GetDateTimeFormats()[3];
        //08/23/2013

        String FormatWayTwo = DT.ToString("MM/dd/yyyy");
        //08/23/2013

        return FormatWayOne;
    }
}

我有一个带有Global 方法的Global 类将DateTime 格式化为String。但是在这里我想知道哪种方法是最佳实践以便我可以使用它?该方法在整个应用程序中被调用。

【问题讨论】:

  • 仅供参考 DateTime 没有任何格式。它存储为Long(Ticks)DateTime 的字符串表示只拥有格式
  • +1 奇怪,没听说过DateTime.GetDateTimeFormats

标签: c# .net datetime formatting string-formatting


【解决方案1】:

如果您只想要日期并且如我所见,文化格式是正确的,只需使用日期时间方法 ToShortDateString

MyDateTime.ToShortDateString();

但是在扩展方法中使用它没有任何意义。如果您想将任何格式的任何日期转换为始终以 MM/dd/yyyy 显示,则应首先设置文化和调用方法。

在此处查看正确的代码以使用http://msdn.microsoft.com/es-es/library/system.datetime.toshortdatestring.aspx

【讨论】:

  • 是的,我同意这也是一种方式。,
  • 已编辑以修复一些拼写错误
【解决方案2】:

我只喜欢ToString(format) 版本。但不是您作为示例显示的格式。它可以让你了解整个文化。 让我们看看下面的例子。

    DateTime now = DateTime.Now;

    string fmt1 = now.ToString("MM/dd/yyyy"); // MM/dd/yyyy
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us")
    { 
        DateTimeFormat=
        {
            DateSeparator = "-"
        }
    };
    string fmt1a = now.ToString("MM/dd/yyyy"); // MM-dd-yyyy (you're in trouble when you want to deserialize)

    string fmt2 = now.ToString("MMddyyyy"); // MMddyyyy
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us")
    {
        DateTimeFormat =
        {
            DateSeparator = "-"
        }
    };
    string fmt2a = now.ToString("MMddyyyy"); and // MMddyyyy always

我不会在这里谈论GetDateTimeFormats,因为它有点矫枉过正。

想知道fmt1a 如何在您说MM/dd/yyyy 时返回MM-dd-yyyy?因为/是一个特殊字符,用来表示当前文化的DateTimeFormatInfo.DateSeperator

因此,我建议您使用不带/ 的自定义格式进行序列化和任何其他 UI 格式。

【讨论】:

    【解决方案3】:

    哪个是好的做法或最好的方法

    两者都适合自己的需求。

    这两种方式的区别?

    GetDateTimeFormats()

    将此实例的值转换为标准日期和时间格式说明符支持的所有字符串表示形式。这意味着这是一项昂贵的操作,并且每次获取第三个元素可能会给您带来不同的结果。您不需要转换为所有格式,为什么要这样做?

    ToString()

    使用指定格式将当前 DateTime 对象的值转换为其等效的字符串表示形式。

    有什么建议或想法吗?

    作为第二种方法 (ToString) 仅转换为您所需的格式,并且更具可读性。因此优选。然而,如果您使用第一种方法,当您只需要一种格式时,您将转换为大约 100 种格式。

    【讨论】:

      【解决方案4】:

      我已经使用 .ToString(format) 多年了,它从来没有让我失望过。您可以使用内置格式,也可以自定义自己的格式。

      【讨论】:

        【解决方案5】:

        GetDateTimeFormats 不能替代ToString,反之亦然。如果您知道您想要什么格式,则无需致电GetDateTimeFormats。除了使用ToString 更清晰之外,GetDateTimeFormatsdocument 也说明了这一点(强调我的)

        由于此方法使用文化敏感数据,您不应假设 多次调用该方法将返回相同的数据。数据 如果当前区域性发生变化,则此方法返回的值可能会发生变化, 用户覆盖个人文化设置,或发生更新 系统的文化数据。

        这可能会破坏您的代码,因为在另一种文化中运行时,第三个元素可能是别的东西。

        通过使用 ToString,您可以避免遍历所有日期格式(因此效率更高),并且您可以更清楚地了解您喜欢的格式,同时确保返回的格式是您想要的格式。

        【讨论】:

        • 真的。如果你知道你想要什么 - 打电话给它。无需使用桶获取然后选择它。
        【解决方案6】:

        ToString 更清晰,并且它不使用在下一个框架版本/另一种文化中可能不起作用的幻数。使用ToString()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-27
          • 2010-12-22
          • 1970-01-01
          • 1970-01-01
          • 2014-09-30
          • 1970-01-01
          • 1970-01-01
          • 2010-10-24
          相关资源
          最近更新 更多