从包含十进制和逗号毫秒分隔符的字符串转换为DateTime

时间:2011-10-02 16:33:21

标签: c# string datetime

鉴于以下2个字符串,请注意“.185”和“,185”

  • 2011-09-15 17:05:37,185
  • 2011-09-15 17:05:37.185

从文件中读取(不在我的控制中),我可以看到它们都有两种格式的日期。我需要创建一个适合这两种情况的函数。

”和“”特定的文化?

对此类功能的任何建议?

以下内容无效,因为我没有约会。

 class Program
{
    static void Main(string[] args)
    {
        string date1="2011-09-15 17:05:37.185";
        string date2="2011-09-15 17:05:37,185";

        const string format1 = "dd/MM/yyyy HH:mm:ss.ff";
        const string format2 = "dd/MM/yyyy HH:mm:ss,ff";
        DateTime resultDate1;
        DateTime resultDate2;
        DateTime.TryParseExact(date1, format1, CultureInfo.InvariantCulture, DateTimeStyles.None, out resultDate1);
        DateTime.TryParseExact(date2, format2, CultureInfo.InvariantCulture, DateTimeStyles.None, out resultDate2);
         Console.WriteLine(resultDate1.ToString());
         Console.WriteLine(resultDate2.ToString());
         Console.Read();
     }
  }

2 个答案:

答案 0 :(得分:8)

  是的。而且,具体的文化?

是。在欧洲,通常使用逗号代替句点作为小数分隔符。

  

对解决方案的任何建议?

是。我的第一个想法是DateTime.ParseExact()/ DateTime.TryParseExact()函数有一个overload that allows an array of formats来测试。您可以包含en-US变体和en-GB变体。除了我认为这不会起作用,因为你仍然只能包含一个文化说明符。因此,我建议在将字符串传递给ParseExact函数之前调用.Replace(),以将字符串中可能包含的任何逗号更改为句点。

在更新的示例代码中,您的格式字符串与您的示例日期不匹配。你应该用这个:

  

yyyy-MM-dd HH:mm:ss.fff

答案 1 :(得分:3)

你应该使用Hans Passant评论中建议的DateTime.ParseExact或.TryParseExact。

DateTime d1;
string[] formats = new [] { "yyyy-MM-dd HH:mm:ss.fff", "yyyy-MM-dd HH:mm:ss,fff" };
DateTime.TryParseExact(s1, formats, CultureInfo.InvariantCulture, 
                    DateTimeStyles.None, out d1);

您还应指定CultureInfo.InvariantCulture,否则ParseExact方法可能会使用特定于文化的日期分隔符(代替/,例如德国的“。”)或时间分隔符(代替“:”)