.net DateTime:要求用户输入时间组件
检查用户输入是否为有效日期或有效的“日期+时间”很容易:.NET提供.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", _
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
接受的所有格式,附加的限制是必须指定时间组件。