C# 在DateTime对象中设置年份

C# 在DateTime对象中设置年份,c#,datetime,C#,Datetime,如何仅更改datetime对象中的年份 我需要从excel调用多个日期,如果调用的日期早于todays date,请将年份设置为2099 e、 g.称为:2010年11月15日的日期需要设置为2099年11月15日 这可行吗?还是最好改变整个日期 日期时间是不可变的类型。您不能更改年份或其任何其他部分。您应该使用新年创建新的DateTime实例。没有其他选择 var date1 = DateTime.Now; var date2 = new DateTime(2099, date1.Month,

如何仅更改datetime对象中的年份

我需要从excel调用多个日期,如果调用的日期早于todays date,请将年份设置为2099

e、 g.称为:2010年11月15日的日期需要设置为2099年11月15日


这可行吗?还是最好改变整个日期

日期时间是不可变的类型。您不能更改年份或其任何其他部分。您应该使用新年创建新的
DateTime
实例。没有其他选择

var date1 = DateTime.Now;
var date2 = new DateTime(2099, date1.Month, date1.Day);

如果需要经常编写扩展,您可以编写扩展:

public static DateTime JumpToYear(this DateTime date, int year)
{
    // you can also provide Hour, Minute, Second and Millisecond
    return new DateTime(year, date.Month, date.Day);
}
用法:

var date2 = date1.JumpToYear(2099);

注意:更改年份时,2月29日的日期可能会变得无效。

您只需创建一个新的
DateTime
,因为
DateTime
是一个不可变的结构:

DateTime newDt = new DateTime(2099, dt.Month, dt.Day);
如果要处理leapyear问题(源日期为leapyear,但目标年份不是),可以使用以下扩展方法:

public static DateTime ChangeYear(this DateTime dt, int newYear)
{
    return dt.AddYears(newYear - dt.Year);
}
这甚至会保留
记号
和,因此它比使用
日期时间
构造函数要好。如果原始日期时间是2016年2月29日(闰年),它将返回
02/28/2099

例如,您可以这样使用它:

DateTime dt = new DateTime(2016, 2, 29);
DateTime newDt = dt.ChangeYear(2099); 

2月29日出现问题(例如,
dt==2016年2月29日
)@DmitryBychenko:true,但OP将得到一个有意义的异常。你会怎么做才能“修复”它?@DmitryBychenko我已经指出了这个问题,但你不能说2016年2月29日<代码>应该翻译成2099年3月1日。如何处理2016年3月1日的
1
?这只是一个错误。工作伙伴就是这样。@MattJohnson:我不明白
DateTime.IsLeapYear
有什么帮助,但我编辑了我的答案,以显示一种完全不同且简单得多的方法,该方法还保留了刻度和
类型(
:)