DateTime.TryParse or Datetime.TryParseExact?

本文关键字:TryParseExact Datetime or TryParse DateTime | 更新日期: 2023-09-27 17:50:09

我正在从字符串转换日期和时间。我将输入中的日期部分添加到如下

string joinedString = txtMonth.Text.Trim() + "/" + txtDate.Text.Trim() + "/" + txtYear.Text.Trim();

通常我将字符串转换为下面的

DateTime dt;
if (DateTime.TryParse(joinedString, out dt))
{
    lblOutputCulture.Text = dt.ToString();
}
else
{
    lblOutputCulture.Text = "Invalid Date Time!!!";
}

在这里,如果区域性和datetime格式与我的字符串模式相同,我可以获得日期时间。但如果像'dd-MM-yy'这样更改,则转换应该失败。

为了克服这个问题,我们需要使用InvariantCulture进行解析。为此,我找到了2个方法

方法1:使用DateTime。TryParse

if (DateTime.TryParse(joinedString, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
    lblOutput.Text = dt.ToString();
}
else
{
    lblOutput.Text = "Invalid Date Time!!!";
}

此处,即使更改了系统的日期时间格式,也成功地转换了日期时间。还有以下优点i)日期和月份输入为1位或2位ii)年份输入为2位或4位

方法2:使用DateTime。TryParseExact

if (DateTime.TryParseExact(joinedString, "M/d/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
    lblOutput.Text = dt.ToString();
}
else
{
    lblOutput.Text = "Invalid Date Time!!!";
}

这里的datetime也被转换为特定于文化的格式,但严格按照tryparseexact语句中给出的格式进行转换。

但以下是对此的问题i)如果我给出4位数的年份输入,它显示无效的日期和时间。如果我将格式更改为'M/d/yyyy',我无法给出2位数的年份。就像如果我添加时间部分,我需要给时间部分强制。

那么哪个更好呢?请给个建议。但大多数情况下,我发现第二种方法在所有的博客和论坛。

哪个是正确的?

DateTime.TryParse or Datetime.TryParseExact?

我都不会用:

try {
  DateTime dt = new DateTime(int.Parse(txtYear.Text),
                             int.Parse(txtMonth.Text),
                             int.Parse(txtDate.Text));
   lblOutput.Text = dt.ToString(); //Not sure why we'd do this, but whatever
} catch (ArgumentOutOfRangeException) {
   lblOutput.Text = "Invalid Date Time!!!";
}

这很容易扩展到包括其他部分,例如时间,通过选择不同的构造函数重载。