我应该使用ToString()或GetDateTimeFormats()来格式化DateTime吗?

时间:2013-08-23 07:35:38

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

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

但我发现并尝试了两种方法:

  1. GetDateTimeFormats()
  2. ToString("MM/dd/yyyy")
  3. 我试过这段代码:

    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。但在这里我想知道哪种方法是最佳实践,所以我可以使用它?该方法在整个应用程序中调用。

6 个答案:

答案 0 :(得分:9)

GetDateTimeFormats不是ToString的替代品,反之亦然。如果您知道自己想要的格式,则无需拨打GetDateTimeFormats。除了使用ToString更明确之外,GetDateTimeFormats {{1}}说明了这一点(强调我的)

  

因为此方法使用文化敏感数据,所以不应该假设   多次调用该方法将返回相同的数据。数据   如果当前文化发生变化,这种方法返回的可以改变   用户覆盖单个文化设置,或发生更新   系统的文化数据。

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

  

哪一个是良好实践或最佳方式

两者都有利于自己的需要。

  

这两种方式有什么区别?

<强> GetDateTimeFormats()

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

<强> ToString()

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

  

任何建议或想法?

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

答案 3 :(得分:3)

我更喜欢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因为它太过分了。

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

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

答案 4 :(得分:2)

我已经使用.ToString(格式)多年了,它永远不会让我失望。您可以使用内置格式,也可以自定义。

答案 5 :(得分:2)

如果你只想要日期和我看到的,文化格式是正确的,只需使用datetime方法ToShortDateString

MyDateTime.ToShortDateString();

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

点击此处查看使用http://msdn.microsoft.com/es-es/library/system.datetime.toshortdatestring.aspx

的正确代码