ParseExact / TryParseExact以单位数小时失败

时间:2017-07-10 21:49:18

标签: c# datetime

我有一个没有字段分隔符的时间和日期值,我尝试使用num1=num1-'0'; 解析为DateTime。时间组件有一位数小时,两位数分钟和秒。

以下表达式:

TryParseExact

导致DateTime.ParseExact("20170101 84457", "yyyyMMdd Hmmss", System.Globalization.CultureInfo.InvariantCulture) 消息"字符串未被识别为有效的DateTime。"。我假设这是因为时间无法明确解决,但由于FormatExceptionmm总是两位数,我不明白为什么会这样是一个问题。

以下结果是成功解析:

  • 黑客输入时间以包括分隔符(例如,' 44:57'以及' H:mm:ss')
  • 将输入时间克服为前导零,如果< 6位数

这两个看起来都是一个黑客攻击。

2 个答案:

答案 0 :(得分:1)

other people's research我可以理解,解析尝试检索两个数字(如果可以),并从左到右解析。

使用原始时间值84857和格式Hmmss的失败示例,因为小时后跟一个数字,它将被解析为84 - 因此抛出格式异常

答案 1 :(得分:-1)

根据the documentation

  

如果format是不包含日期或时间分隔符的自定义格式模式(例如" yyyyMMddHHmm"),请使用provider参数的不变区域性和每个自定义格式说明符的最宽格式。例如,如果要在格式模式中指定小时数,指定更宽的形式," HH"而不是更窄的形式," H"

因此,如果您没有分隔符,则需要使用HH而不是H

我个人将时间组件填充到6位数并使用HH。以下工作对我来说很好:

DateTime.ParseExact("20170101 084457", "yyyyMMdd hhmmss", System.Globalization.CultureInfo.InvariantCulture);

如果要将其包装在自定义函数中,可以使用以下内容:

    static DateTime ParseDateTime(string input)
    {
        int dateInteger, timeInteger;

        var s = input.Split(' ');
        bool dateOK = int.TryParse(s[0], out dateInteger);
        bool timeOK = int.TryParse(s[1], out timeInteger);

        if (!dateOK || !timeOK) throw new FormatException("Invalid date/time string.");

        var newInput = String.Format("{0:00000000} {1:000000}", dateInteger, timeInteger);
        return DateTime.ParseExact(newInput, "yyyyMMdd hhmmss", System.Globalization.CultureInfo.InvariantCulture);
    }