【问题标题】:DateTime.TryParse - What was actually parsed?DateTime.TryParse - 实际解析了什么?
【发布时间】:2013-07-23 11:40:53
【问题描述】:

我在使用 DateTime.TryParse() 的 C# 中有点挣扎。

基本上,给定一个字符串,我需要提取当前显示文化中的年和/或月和日。有时我只得到一年,或一个月,或全部三个。根据我得到的,我有不同的控制流程。

到目前为止,我设法将各种字符串解析为DateTime;这不是我的问题。

我的问题是我想知道实际解析了什么(即我得到了一个月还是一年,或两者兼而有之)。

未初始化的DateTime默认为01/01/0001,我无法将所有内容设置为无效日期,例如99/99/9999,然后查看填充了什么。

我在想也许我需要做正则表达式,但 DateTime 类提供了对多种文化的解析,这在这个项目中非常重要。

我试过搜索这个,但也许我没有使用正确的术语,因为肯定有人以前遇到过这个问题。

更新: 这是我所拥有的一些示例代码:

string strIn = Console.ReadLine();
DateTimeStyles enStyles = DateTimeStyles.AllowInnerWhite | DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite | DateTimeStyles.AssumeLocal;
bFound = DateTime.TryParse(strIn, CultureInfo.CreateSpecificCulture("en-US"), enStyles, out cDT);

现在,如果 something 被成功解析,bFound 将为真。但是,我需要知道日期的哪些部分被成功解析

【问题讨论】:

  • 您能否提供更清晰的说明?您想检测无效日期吗?实际上你的问题并不清楚这个问题。
  • 您期望什么样的输入...提供一些示例。但一般而言,TryParse 方法只是尝试确定字符串是否为可制成日期的格式。你总是得到 4 位数的年份吗?如果不是,那么您如何区分 1912 年的“12”年和 12 月(即 12 月)之间的区别?
  • “解析了什么”是什么意思?它要么完全解析,要么不解析。解析“一个月”或“一年”的例子是什么?此外,DateTime 基本上只是一个数字。它并没有真正将月份部分或年份部分保留在单独的字段中。
  • 好吧,也许我的措辞令人困惑。我希望能够问“你有一年吗?”或“您是否因为未提供任何月份而默认月份?”
  • 好吧,我不认为有任何内置的东西。所以你需要自己做检查。例如,如果年份不是 0001 或当前年份,则可能已提供。如果 inputString.Contains("0001" or current year),它也被提供。如果没有,那么可能只提供了年份的最后两位数字,但检查可能会干扰月/日值。几个月会特别有趣。玩一下GetMonthName。不过你可能不会得到 100%...

标签: c# datetime localization tryparse


【解决方案1】:

我不明白你的意思,但你是否正在为你的日期时间寻找一个指定的格式?

string dateAndTimeFormat = "yyyy.MM.dd HH:mm:ss:fff"; // example of format

string dateAndTime = yourdatetimevalue;

DateTime toDateTime = DateTime.ParseExact(dateTime, dateTimeFormat, System.Globalization.CultureInfo.InvariantCulture)

如何使用格式: http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx

编辑 1

tryparse 返回真或假。如果失败则为假。也许有用吗? 否则,如果可以的话,您可以在 tryparse 之前设置文化。

DateTime.TryParse(dateString, culture, styles, out dateResult)

在此处查看示例:http://msdn.microsoft.com/en-us/library/9h21f14e.aspx

备注:

"如果可能,此方法会尝试忽略无法识别的数据,并用当前日期填充缺少的月、日和年信息。如果 s 仅包含日期而没有时间,则此方法假定时间为 12:00午夜。如果 s 包含具有两位数年份的日期组件,则它会根据 Calendar.TwoDigitYearMax 属性的值转换为当前区域性的当前日历中的年份。s 中的任何前导、内部或尾随空白字符被忽略。日期和时间可以用一对前导和尾随 NUMBER SIGN 字符('#',U+0023)括起来,并且可以在尾随一个或多个 NULL 字符(U+0000)。"

希望对你有所帮助。

【讨论】:

  • 感谢您的回答。不,我不是要准确解析,因为输入可能会有所不同(在当前文化可接受的范围内)。但是,我想知道成功解析了日期的哪些组成部分。
  • @namezero 我编辑了答案,希望对您有所帮助。我只认为你可以从 tryparse 中得到真或假。
  • 是的,这就是我害怕的。感谢您提供文档中的报价。
  • @butterbox 继续我之前对您已删除答案的评论:您想提供帮助真是太棒了。但是考虑提供这种的帮助,这真的很棒而且很详细。保持良好的工作。 =)
【解决方案2】:

DateTime.TryParse() 仅在成功时返回值。 因此,对于下面的代码示例,变量 dt 在声明时被初始化为 01/01/0001 00:00:00。 当TryParse 尝试从字符串(MM/DD/YYYY 格式)中提取日期时,如果失败,则 dt 变量的值为 01/01/0001 00:00:00。否则dt 将包含实际提取的日期时间值(如 2 中所示)。

1)

DateTime dt;
DateTime.TryParse("23/15/2013", out dt);
// dt contains "01/01/0001 00:00:00"`

2)

`DateTime dt;
DateTime.TryParse("23/12/2013 6:25", out dt);
// dt contains "23/12/2013 06:25:00"`

无需检查实际解析的内容。 日期时间值如果有效则解析,否则返回默认日期时间值。

【讨论】:

  • 好吧,我可以看到需要知道。如果你 TryParse "Feb 03" 你会得到 "2013-02-03"。但是字符串中没有提供 2013 年。 TryParse 方法只是“猜测”了它。并且 OP 想知道,哪些值是“猜测的”,哪些是真正在字符串中提供的。
  • 是的,我认为按照 Corak 上面的建议,唯一的方法就是在字符串中探查已解析日期时间的值。或者当然是手动完成,这似乎不是最好的主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2013-06-02
  • 2020-11-21
  • 2013-11-04
  • 2015-02-26
  • 2017-06-29
  • 2013-06-13
相关资源
最近更新 更多