2

我在这里有 ac# 代码块:

    string inputString = textBox1.Text;
    DateTime dt;
    try
    {
        if (DateTime.TryParseExact(inputString, "yyyyMMdd", null, DateTimeStyles.None, out dt) == true)
        {
            dt = dt.AddMonths(6);
            textBox2.Text = dt.ToString("yyyyMMdd");
        }
        else if (DateTime.TryParseExact(inputString, "yyyy.MM.dd", null, DateTimeStyles.None, out dt) == true)
        {
            dt = dt.AddMonths(6);
            textBox2.Text = dt.ToString("yyyyMMdd");
        }
    }   
    catch (Exception ex) { MessageBox.Show(ex.Message); }

基本上,它的作用是,用户在 textbox1 中输入一个字符串,单击按钮时,C# 将检查文本框中的日期格式,然后在日期上添加 6 个月并将其输出到 textbox2 中以字符串格式 yyyyMMdd。正如您现在所看到的,它接受 yyyyMMdd 和 yyyy.MM.dd 并执行相同的过程。但我的问题是我还有很多日期格式:

dd-MM-yy 
yyyy/mm/dd 
yyyy-mm-dd 
yy/mm/dd 

我不想在我的 IF 语句中使用 OR。有没有一种方法,无论格式是什么,都将被接受并执行该过程。非常感谢你们!

4

3 回答 3

5

TryParseExact重载之一接受一个字符串数组作为其第二个参数。但是,它不会确切地告诉您使用了哪种格式。如果您确实需要该信息,那么是的,您只需要使用所需的每种格式运行一种格式的 TryParseExact,然后查看哪种格式有效。

而且,当然,您需要确保您允许的所有格式对于哪些部分是日、月和年是明确的,否则您可能会将 01/02/03 解析为六个可能日期中的任何一个。

于 2013-07-05T02:32:00.893 回答
3

DateTime.TryParseExact有一个重载,它接受多种格式来尝试解析。

DateTime date;
DateTime.TryParseExact("11-Nov-13", new[] { "yyyy-MM-dd","MM/dd/yy","dd-MMM-yy"}, null, DateTimeStyles.None, out date); 

然而,Lee Taylor 的评论仍然是正确的,因为如果您的格式可能模棱两可,您将不知道究竟出了什么问题。

如果您的解决方案要求您使用与提供的相同样式返回格式化字符串 - 那么您需要将格式传递到循环中并单独尝试。

于 2013-07-05T02:32:22.923 回答
0

您可以通过使用位于命名空间 System.Globalization 下的CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns()检查所有可能的格式。

您可以使用DateTime.TryParseExact,它具有接受多种格式的重载来尝试解析 - ParseExact(string s, string[] formats, IFormatProvider provider, DateTimeStyles style)

示例代码:

private DateTime GetDate(string date)
{
    DateTime dateTime = new DateTime();
    string[] formats = CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns();

    try
    {
        dateTime = DateTime.ParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    }
    catch
    {
        throw ...;
    }

    return dateTime;
}
于 2017-03-21T09:12:27.093 回答