2017-01-23 2 views
0

Как мне изменить только год в объекте datetime?Задайте год в объекте DateTime

Мне нужно позвонить ряд дат из Excel, и если сроки я называю это до даты сегодняшнего, установить год до 2099.

например дата, которая называется: 15/11/2010 должна быть установлена ​​на 15/11/2099

Это выполнимо? или было бы лучше изменить всю дату?

ответ

5

Вам просто нужно создать новый 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); 
} 

Это сохранит даже Ticks и Kind, так что лучше, чем с помощью DateTime конструктора. Он вернет 02/28/2099, если оригинал DateTime был 02/29/2016 (високосный год).

Вы можете использовать его, например, таким образом:

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

Там проблема с '29 Feb' (например,' дт == 29 февраля 2016') –

+0

@DmitryBychenko: верно, но ОП получит значащее исключение. Что бы вы сделали иначе, чтобы «исправить» его? –

+0

@DmitryBychenko Я уже указал эту проблему, но вы не можете сказать, что '29 февраля 2016' следует перевести на« 1 марта 2099 года ». Что делать с «1 марта 2016 года»? Это всего лишь случай с ошибкой –

7

DateTime - неизменный тип. Вы не можете изменить год или любую другую его часть. Вы должны создать новый экземпляр 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); 

Примечание: Дата 29 февраля может стать недействительным, когда вам изменение год.

Смежные вопросы