【问题标题】:Convert different format of DateTime to specific String format将不同格式的 DateTime 转换为特定的 String 格式
【发布时间】:2012-10-17 06:48:17
【问题描述】:

我从不同的机器获取System.datetime.now。每个系统都有不同的日期时间格式,如下所示

16-Oct-12 7:25:22 PM
16/10/2012 7:10:47 PM [DD/MM/YYYY]
10/16/2012 7:10:51 PM [MM/DD/YYYY]

如何将不同格式的DateTime转换成特定的字符串格式?

string sDateTime = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"); 

【问题讨论】:

  • 听起来您正在使用字符串从其他机器“传输”日期时间。难道你不能简单地使用一个 DateTime 对象,并且只在实际显示日期时使用自己提供的代码将其格式化为字符串吗?
  • 知道你得到的每个字符串的格式吗?如果不是,你怎么能指望弄清楚(比如)“10/11/2012 7:10:47 PM”是什么意思?那是 10 月 11 日还是 11 月 10 日?
  • (如果你控制了两台机器,你只需要避免使用不同的格式......不同文化给出不同格式的意义在于用户演示,不是机器对机器的通信。)

标签: c# c#-4.0 datetime datetime-format


【解决方案1】:

谷歌搜索的第一个结果:Custom datetime format strings from MSDN

返回日期时间时,您必须使用您在其他机器上明确提供的代码行:

string sDateTime = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt");]

然而,这不知道时区!如果您的应用程序跨越多个时区,您也应该考虑到这一点!

或者,更好的是,您可以将 Unix 时间(从 1970 年 1 月 1 日开始的毫秒数)返回一个很长的时间,当然还有时区信息,如果这在机器之间是不同的......(注意,.NET展览时间是从 0001-01-01 开始!)

Returning Epoch time

  • 我建议反对使用 tryParse:只有当月份大于 12 时,您才能可靠地确定日期是在 [DD/MM/YYYY] 还是 [MM/DD/YYYY]...会导致神秘的错误。相信我,去过那里,做到了(调试部分)......

【讨论】:

    【解决方案2】:

    试试 Datetime 类的TryParse 方法

    链接中的示例:

    string[] dateStrings = {"05/01/2009 14:57:32.8", "2009-05-01 14:57:32.8", 
                            "2009-05-01T14:57:32.8375298-04:00", 
                            "5/01/2008 14:57:32.80 -07:00", 
                            "1 May 2008 2:57:32.8 PM", "16-05-2009 1:00:32 PM", 
                            "Fri, 15 May 2009 20:10:57 GMT" };
    DateTime dateValue;
    
    Console.WriteLine("Attempting to parse strings using {0} culture.", 
                      CultureInfo.CurrentCulture.Name);
    foreach (string dateString in dateStrings)
    {
       if (DateTime.TryParse(dateString, out dateValue)) 
          Console.WriteLine("  Converted '{0}' to {1} ({2}).", dateString, 
                            dateValue, dateValue.Kind);
       else
          Console.WriteLine("  Unable to parse '{0}'.", dateString);
    }
    

    请注意,在示例中它不适用于所有给定的字符串日期

    【讨论】:

      【解决方案3】:

      您的示例的问题是最后两种格式16/10/2012 7:10:47 PM [DD/MM/YYYY]10/16/2012 7:10:51 PM [MM/DD/YYYY]。如果值为10/11/2012 7:20:10 PM,你怎么知道是2012年10月11日还是2012年11月10日?

      var input = new string []{ "16-Oct-12 7:25:22 PM",
                      "16/10/2012 7:10:47 PM",
                      "10/16/2012 7:10:51 PM"};
      
      foreach (var date in input)
      {
          var result = DateTime.MinValue;
      
          if (DateTime.TryParse(date, out result))
          {
              Console.WriteLine("Date value: {0}", result);
          }
          else
          {
              Console.WriteLine("Cannot parse value {0}", date);
          }
      }
      

      如您所见,"16/10/2012 7:10:47 PM" 无法解析。

      【讨论】:

        【解决方案4】:
         if (DateTime.TryParse(DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt"), out result))
                            sDateTime = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt");
                        else
                        {
                            if (System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern.Equals("dd-MMM-yy")) sDateTime = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt");
                            else sDateTime = DateTime.Now.Month +"/" + DateTime.Now.Day+ "/" + DateTime.Now.Year + " " +  DateTime.Now.ToString("hh:mm:ss tt");
                        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-05
          • 1970-01-01
          • 2016-09-08
          • 2012-10-17
          • 1970-01-01
          相关资源
          最近更新 更多