Parse to DateTime格式(M)M /(d)d / yy(h)h:mm tt

时间:2018-05-11 17:14:19

标签: c# datetime

我觉得这很容易: 我想将以下字符串格式解析为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);

我的下一个想法是拆分42518并添加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:如何干净地将inputinput2解析为DateTime?

由于

2 个答案:

答案 0 :(得分:2)

您可以将代码更改为此类型,然后它应接受单位和双位数字格式:

DateTime.TryParseExact(
    input, "M/d/yy h:mm tt",CultureInfo.InvariantCulture, DateTimeStyles.None,
    out var theDate);

格式字符串中的单个字符Mdh组件允许单个或两个数字。

Fiddle

答案 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对象。