.net DateTime:要求用户输入时间组件

.net DateTime:要求用户输入时间组件,.net,datetime,parsing,date-parsing,.net,Datetime,Parsing,Date Parsing,检查用户输入是否为有效日期或有效的“日期+时间”很容易:.NET提供DateTime.TryParse(此外,VB.NET提供IsDate) 现在,我想检查用户是否输入了包含时间成分的日期。因此,当使用德语区域设置时,31.12.2010 00:00应该可以,但31.12.2010不应该 我知道我可以这样使用: Dim formats() As String = {"d.M.yyyy H:mm:ss", "dd.M.yyyy H:mm:ss", _

检查用户输入是否为有效日期或有效的“日期+时间”很容易:.NET提供
DateTime.TryParse
(此外,VB.NET提供
IsDate

现在,我想检查用户是否输入了包含时间成分的日期。因此,当使用德语区域设置时,
31.12.2010 00:00
应该可以,但
31.12.2010
不应该

我知道我可以这样使用:

Dim formats() As String = {"d.M.yyyy H:mm:ss", "dd.M.yyyy H:mm:ss", _
                           "d.MM.yyyy H:mm:ss", "d.MM.yyyy H:mm:ss", _
                           "d.M.yyyy H:mm", ...}
Dim result = DateTime.TryParseExact(userInput, formats, _
       Globalization.CultureInfo.CurrentCulture, ..., result)
但接下来我会硬编码指定日期的德语格式(day-dot-month-dot-year),这被认为是一种不好的做法,如果我们想要本地化应用程序,这将带来麻烦。此外,
格式
将是所有可能组合(一位数、两位数,…)的一个相当大的列表


有更优雅的解决方案吗?

您可以从属性中获取区域性的日期/时间格式选项。例如,要获取当前区域性的完整日期/时间模式,您可以访问:

CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern
对我来说,在英国,这给了我:

dd MMMM yyyy HH:mm:ss

我不确定这是否比你已经拥有的更优雅,但是:

  • 按空格分割修剪后的输入
  • 对最后一块进行
    TimeSpan.TryParse
  • 如果此操作成功,请检查生成的
    TimeSpan
    值是否为非负值,并且小于一天

除了对整个字符串执行
DateTime.TryParse
之外,还可以执行所有这些操作,这样您应该更加确信指定了时间组件。

我认为您应该将用户输入、文本框中的日期(或任何内容)和另一个文本框中的时间分开

另一种解决方案是使用某种蒙面控件,其中不强制执行d/m/y顺序,但强制执行MM:SS,这在每个图形中都是相同的


这不是问题的答案,但我目前正在使用
IsDate(userInput)
Regex.IsMatch(userInput,“\d:\d”)
相结合,这可能适用于我们将来可能支持的每种语言环境,但这仍然是一个难看的攻击。感谢您的输入,但这并不能帮助我解决问题:为了方便用户,我不仅需要接受
dd-MMMM-yyyy-HH:mm:ss
,而且还需要接受
dd-MMMM-yyyy-HH:mm
d-MMMM-yyyy-HH:mm:ss
,等等。因此,我需要(基本上)接受
DateTime.TryParse
接受的所有格式,附加的限制是必须指定时间组件。