如何使用DateTime将变量作为参数传递

时间:2019-07-01 18:22:55

标签: c# datetime

当前正在编写一些代码,我想使用DateTime.Parse,传递一个指定格式的字符串,但也带有一些变量。

示例:

DateTime first_day = DateTime.Parse("{0}/01/{1}", Today.Month - 1, Today.Year - 1); 
DateTime first_day = DateTime.Parse("12/01/{0}", Today.Year - 1);

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:5)

不要使用字符串插值或操纵传递给构造函数的变量。两者都会导致尝试创建不存在的日期。

例如,今天是7月31日,尝试创建日期为6月31日将在使用FormatException时抛出DateTime.Parse,而在使用{{1}时抛出ArgumentOutOfRangeException }构造函数。

同样,仅当关联年份为a年时,尝试创建2月29日的日期才有效。 DateTime有效,但2020-02-29无效。

此外,在1月传递一个日期,例如2019-02-29会尝试在第0个月(2020-01-01)中创建一个日期,这也是无效的。

相反,请使用2019-00-01和/或AddYears方法:

AddMonths

这些将正确地移回有效日期。 DateTime first_day = DateTime.Today.AddYears(-1).AddMonths(-1); DateTime second_day = DateTime.Today.AddYears(-1); 成为July 31st - 1 monthJune 30th变成Feb 29th 2020 - 1 year,依此类推。

如果您需要赶上本月的第一天,则可以执行以下操作:

Feb 28th 2019

(所有月份都有一天。)

答案 1 :(得分:1)

您可以像这样使用string interpolation(与C# 6.0 version一起使用)

DateTime first_day = DateTime.Parse($"{Today.Month - 1}/01/{Today.Year - 1}");

DateTime first_day = DateTime.Parse($"12/01/{Today.Year - 1}");

在您的DateTime.Parse方法中不需要任何参数。此方法不支持composite formatting,因此您做不到。

您还可以将new DateTime(Int32, Int32, Int32)构造函数用作Ed commented,将年,月和日作为参数。

顺便说一句,正如Matt所言,这些Month-1计算是一种反模式,它们可以将您引向某些不存在的日期。 See his answer for more details

答案 2 :(得分:0)

您可以像这样使用string.Format

var first_day = DateTime.Parse(string.Format("{0}/01/{1}", DateTime.Today.Month - 1, DateTime.Today.Year - 1));