c# - DateTime.TryParse API 关于日期元素分隔符或定界符的内部行为

标签 c# date datetime

我正在使用 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);
    }
}

此代码打印以下字符:

  1. /(正斜杠)
  2. >。 (期间)
  3. -(连字符)
  4. .(带尾随空格字符的句点)

所以基本上我迭代了世界上所有的文化,并弄清楚了所有字符都用作日期字段的定界符或分隔符。那么 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/

相关文章:

c# - 当我处理多种数据类型时,如何处理多个 foreach 循环

c# - 如何使用 Facebook C# SDK 读取/发送私有(private)消息?

c# - 如何将矩形的边距绑定(bind)到顶部/底部和左/右的两个 slider

c# - 是否有用于 C# 的开源不可变字典,具有快速 'With/Without' 方法?

Javascript...添加一天至今并更改格式

bash - 如何在 Bash 脚本中增加日期

javascript - 如何在 Angular 引导日期选择器中转换日期格式

java - 序列化和反序列化 Joda DateTime 对象

python - Django:使用 L10N 将 DateTimeField 转换为字符串

.net - DateTime.ToString 模式甚至可以保留最小的部分