我觉得这很容易:
我想将以下字符串格式解析为DateTime
:
“4/25/18 3:11 PM”
并且比我预期的要困难得多。
DateTime.Parse
只返回异常Input string not in the correct format
DateTime.TryParseExact
是我最接近的,它可以解析这个确切的字符串,但它不会考虑日,月,小时(等)超过(或低于,取决于掩码)9因为面具必须完全匹配,否则会失败。
string input = "4/25/18 3:11 PM";
string input2 = "1/1/18 10:10 AM";
DateTime theDate;
DateTime.TryParseExact(input, "M/dd/yy h:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out theDate);
我的下一个想法是拆分4
,25
,18
并添加0,如果它们是< 10,和18之前连接的20但是这似乎有点矫枉过正。如果tt
是AM或PM,它还会给我留出时间和条件。
编辑:基于一些评论......
我无法控制输入字符串。
Convert.ToDateTime("25/4/18 3:11 PM")
会抛出异常{"String was not recognized as a valid DateTime."}
当我将输入日期指定为4/25/18时,输入格式显然为M / dd / yy。不幸的是,这可能意味着输入日期可以是MM / d / yy等。我们可以假设它将始终是月/日/年..
TLDR:如何干净地将input
和input2
解析为DateTime?
由于
答案 0 :(得分:2)
您可以将代码更改为此类型,然后它应接受单位和双位数字格式:
DateTime.TryParseExact(
input, "M/d/yy h:mm tt",CultureInfo.InvariantCulture, DateTimeStyles.None,
out var theDate);
格式字符串中的单个字符M
,d
和h
组件允许单个或两个数字。
答案 1 :(得分:0)
如果代码在美国区域设置和中执行,则日期字符串已知或预期为有效的美国日期格式:
Convert.ToDateTime("4/25/18 3:11 PM")
对于其他语言环境(假设输入字符串在当前文化中有效)尝试此重载:
Convert.ToDateTime("25/4/18 3:11 PM", System.Globalization.CultureInfo.CurrentCulture)
但是,根据您的修订和评论,如果我理解正确,您希望日期始终采用M / D / Y(美国)格式:
我无法控制输入字符串。
Convert.ToDateTime("25/4/18 3:11 PM")
会抛出异常{"String was not recognized as a valid DateTime."}
当我将输入日期指定为4/25/18时,输入格式显然为M / dd / yy。不幸的是,这可能意味着输入日期可以是MM / d / yy等。我们可以假设它总是为月/日/年。
不确定。在这种情况下,您试图针对美国文化中的无效美国约会执行。但是如果你可以假设字符串中提供的日期格式总是月/日/年,那么你应该可以这样做:
Convert.ToDateTime("4/25/18 3:11 PM", new System.Globalization.CultureInfo("en-US"))
这似乎适用于月/日是以单位还是两位数提供,并且应该根据假设的en-US日期字符串返回有效的DateTime
对象。