我有一个没有字段分隔符的时间和日期值,我尝试使用num1=num1-'0';
解析为DateTime
。时间组件有一位数小时,两位数分钟和秒。
以下表达式:
TryParseExact
导致DateTime.ParseExact("20170101 84457", "yyyyMMdd Hmmss",
System.Globalization.CultureInfo.InvariantCulture)
消息"字符串未被识别为有效的DateTime。"。我假设这是因为时间无法明确解决,但由于FormatException
和mm
总是两位数,我不明白为什么会这样是一个问题。
以下结果是成功解析:
这两个看起来都是一个黑客攻击。
答案 0 :(得分:1)
从other people's research我可以理解,解析尝试检索两个数字(如果可以),并从左到右解析。
使用原始时间值84857
和格式Hmmss
的失败示例,因为小时后跟一个数字,它将被解析为84
- 因此抛出格式异常
答案 1 :(得分:-1)
如果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);
}