如何使用DateTime.TryParseExact解析时间值“400”(相当于4:00)

时间:2010-09-08 21:12:53

标签: c# parsing datetime c#-3.0

我正在尝试将用户输入的时间转换为TimeSpans。因为TimeSpan没有TryParseExact方法,所以我在DateTime中使用它并从中转换输出。

我想要处理的格式是:04:00,4400,4:00和400.前三个不是问题,对应于下面方法中if / else结构中的前三种情况。第四个可能对应于最后两个中的任何一个,但两者都不起作用。

    private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
    {
        CultureInfo enUS = new CultureInfo("en-US");
        DateTime parsedDate = new DateTime();

        string userInput = (string)e.Value;
        if (DateTime.TryParseExact(userInput, "HH:mm", enUS, DateTimeStyles.None, out parsedDate))
        {
            e.Value = parsedDate.TimeOfDay;
            e.ParsingApplied = true;
        }
        else if (DateTime.TryParseExact(userInput, "HHmm", enUS, DateTimeStyles.None, out parsedDate))
        {
            e.Value = parsedDate.TimeOfDay;
            e.ParsingApplied = true;                
        }
        else if (DateTime.TryParseExact(userInput, "H:mm", enUS, DateTimeStyles.None, out parsedDate))
        {
            e.Value = parsedDate.TimeOfDay;
            e.ParsingApplied = true;
        }
        else if (DateTime.TryParseExact(userInput, "hmm", enUS, DateTimeStyles.None, out parsedDate))
        {
            e.Value = parsedDate.TimeOfDay;
            e.ParsingApplied = true;
        }
        else if (DateTime.TryParseExact(userInput, "Hmm", enUS, DateTimeStyles.None, out parsedDate))
        {
            e.Value = parsedDate.TimeOfDay;
            e.ParsingApplied = true;
        }

    }

5 个答案:

答案 0 :(得分:4)

我只是对用户输入执行string.PadLeft(int totalWidth, char paddingChar)以确保字符串的长度为4个字符(最小值)。因此,您的Hmm输入将符合HHmm格式。

userInput = userInput.PadLeft(4, '0'); // "400" becomes "0400"

如果你的字符串已经达到或超过4,它将保持不变。

答案 1 :(得分:1)

只是一般性评论 - 您可以将一个布尔变量(如isValidDate)初始化为false,并将其设置为true

 e.Value = parsedDate.TimeOfDay;
 e.ParsingApplied = true;

然后将该代码移动到最后的if块

if isValidDate then
        {
            e.Value = parsedDate.TimeOfDay;
            e.ParsingApplied = true;
        }

答案 2 :(得分:1)

您可以使用this overload of DateTime.TryParseExact一次指定多种格式。它看起来不像Hmm格式,但您可以使用整数解析,如下所示:

internal static class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine(ParseTime("04:00"));
        Console.WriteLine(ParseTime("0400"));
        Console.WriteLine(ParseTime("4:00"));
        Console.WriteLine(ParseTime("400"));
    }

    public static TimeSpan ParseTime(string input)
    {
        CultureInfo cultureInfo = new CultureInfo("en-US");
        DateTime parsedDateTime;

        if (!DateTime.TryParseExact(input, new [] { "HH:mm", "HHmm", "H:mm" }, cultureInfo, DateTimeStyles.None, out parsedDateTime))
        {
            int parsedInt32;

            if (!int.TryParse(input, NumberStyles.None, cultureInfo,  out parsedInt32))
            {
                throw new ArgumentException("Unable to parse input value as time in any of the accepted formats.", "input");
            }

            int remainder;
            int quotient = Math.DivRem(parsedInt32, 100, out remainder);

            return new TimeSpan(quotient, remainder, 0);
        }

        return parsedDateTime.TimeOfDay;
    }
}

答案 3 :(得分:0)

我使用了正则表达式选项(我通常知道使用的更糟糕但我使用的系统需要它......不要问):

Regex.Replace("935", "^([0-9]{3})$", "0$1"); // outputs "0935"

答案 4 :(得分:0)

我解决了这个问题如下:

DateTime.TryParseExact(
    userInput,
    new[] { "%H", "Hm", "H:m" },
    CultureInfo.InvariantCulture,
    DateTimeStyles.None,
    out parsedDate);

我必须赞扬我的帮助:Why is TryParseExact failing on Hmm and Hmmss?