如何确定是否将一年传递到System.Datetime.TryParse

时间:2018-02-05 23:16:59

标签: c# datetime

我需要将用户传递的文本转换为日期时间。我知道用户的文化,所以我传入了:

if (System.DateTime.TryParse(enteredValue, userCultureInfo, DateTimeStyles.None, out newDateTimeValue)
{
  //do something
}

这一切都运行良好,但如果用户一年没有通过,“Do Something”部分需要在newDateTimeValue中添加1年。

e.g。如果用户输入(使用澳大利亚文化代码):

  • 26/02/2018 - 返回DateTime.TryParse的结果(2018年2月26日)
  • 06 2018 - 返回DateTime.TryParse(2018年6月1日)的结果
  • 26/02 - 返回Datetime.TryParse + 1年(2019年2月26日)的结果
  • 2月26日 - 返回Datetime.TryParse + 1年(2019年2月26日)的结果

如果用户在一年内过世,我该如何计算?

2 个答案:

答案 0 :(得分:2)

尝试附加默认年份,如果失败,则解析原始输入:

transform(data,A=unlist(by(Date,ID,FUN=function(x)c(-diff(x),0))))
                   ID       Date   A
1:                 A  2010-12-30  17
2:                 A  2010-12-13 112
3:                 A  2010-08-23   0
4:                 B  2011-06-24  11
5:                 B  2011-06-13 478
6:                 B  2010-02-20   0

它适用于我尝试过的所有测试用例,但可能有一些不同寻常的格式可以与int defaultYear = (DateTime.Now.Year + 1); bool ok = DateTime.TryParse(input + " " + defaultYear.ToString(), out result) || DateTime.TryParse(input, out result); 一起使用,但会以空格分隔的年份打破。

(当然,您可以传递额外的TryParsecultureInfo个参数,为了简洁,我将其遗漏了。

答案 1 :(得分:-2)

所以我做了一个快速测试,似乎如果没有提供年份,将使用当前年份。因此,您需要确定输入的日期是否具有当前年份,如果没有,则先推进它。以下是一个例子。

DateTime parsedResult;
string entry = "26 Feb";
if(DateTime.TryParse(entry, new CultureInfo("en-AU"), DateTimeStyles.None, out parsedResult))
{
    if (!entry.Contains(DateTime.Today.Year.ToString() &&
        !entry.Contains(DateTime.Today.ToString("yy")))
    {
        // This means the entry had no year
        DateTime advanced = parsedResult.AddYears(1);
    }
}