我正在从字符串转换日期和时间。我从我的输入中附加日期部分,如下所示
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!!!";
}
如果文化的culture和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位数的年份数。就像我添加时间部分一样,我需要给时间部分强制性。
哪一个更好?请提出建议。但主要是我在所有博客和论坛中找到了第二种方法..
哪一个是正确的?
答案 0 :(得分:5)
我不会用:
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!!!";
}
这很容易扩展到包括其他部分,例如时间,通过选择constructor的不同重载。