我正在使用 C# .Net 中的 DateTime.TryParse
API。请看下面的代码:
DateTime dt;
//Behavior # 1 : forward slash date separator
bool parsed = DateTime.TryParse("2016/12/01", out dt); //returns true. Date Value 01 December 2016
//Behavior # 2 : dot date separator
parsed = DateTime.TryParse("2016.12.02", out dt); //returns true. Date Value 02 December 2016
//Behavior # 3 : dot date separator
parsed = DateTime.TryParse("2016-12-03", out dt); //returns true. Date Value 03 December 2016
//Behavior # 4 : comma date separator
parsed = DateTime.TryParse("2016,12,04", out dt); //returns true. Date Value 04 December 2016
//Behavior # 5 : space date separator
parsed = DateTime.TryParse("2016 12 05", out dt); //returns true. Date Value 05 December 2016
前三个行为对我来说没问题。我已经知道 /
和 -
被用作日期分隔符。今天,我了解到德语日期时间格式使用点 .
作为日期分隔符。因此,我继续尝试研究 API 如何将逗号 ,
和空格 视为有效的日期分隔符。我写了以下代码:
var allLanguageDateDelimiters = new List<string>();
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
if(allLanguageDateDelimiters.All(x => x != ci.DateTimeFormat.DateSeparator))
{
allLanguageDateDelimiters.Add(ci.DateTimeFormat.DateSeparator);
Console.WriteLine(ci.DateTimeFormat.DateSeparator);
}
}
此代码打印以下字符:
- /(正斜杠)
- >。 (期间)
- -(连字符)
.
(带尾随空格字符的句点)
所以基本上我迭代了世界上所有的文化,并弄清楚了所有字符都用作日期字段的定界符或分隔符。那么 DateTime.TryParse
API 为何能够显示行为 #4 和 5,它成功解析了包含逗号 ,
和空格 的日期字符串> 作为日期分隔符?有人可以指导我了解
DateTime.TryParse
API 的内部实现。我的假设是它应该仅在解析字符串时遵循所有现有区域性的分隔符,但事实并非如此。
最佳答案
对于空白 (),这已经 documented作为;
Any leading, inner, or trailing white space character in
s
is ignored.
所以,所有这些;
DateTime.TryParse("2016 12 05", out dt);
DateTime.TryParse(" 2016 12 05", out dt);
DateTime.TryParse("2016 12 05 ", out dt);
返回 true
。
但为什么是逗号?我认为那是因为 TokenType
枚举的 SEP_Space
在内部 用空格和逗号定义的成员。 Lex
使用此枚举TryParse
中的方法通过调用 GetSeparatorToken
来标记字符串中的当前字符方法。
// Separator tokens.
..
..
SEP_Space = 0x300, // Whitespace (including comma).
关于c# - DateTime.TryParse API 关于日期元素分隔符或定界符的内部行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41056611/