当前正在编写一些代码,我想使用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);
有没有办法做到这一点?
答案 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 month
。 June 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));