2014-11-23 2 views
0

Я хотел бы определить ближайший момент времени, заданный сейчас, и исходный момент времени. Это прекрасно работает следующим образом:получение ближайшей возможной даты с указанием даты и даты в високосный год

var originalPointInTime = new DateTime(2016, 3, 29); 
var now = new DateTime(2017, 2, 3); 

var closestDay1 = new DateTime 
(
now.Year, 
originalPointInTime.Month, 
originalPointInTime.Day, 
originalPointInTime.Hour, 
originalPointInTime.Minute, 
originalPointInTime.Second, 
originalPointInTime.Millisecond 
); 

Однако, если я использую год точку скачка во время он не делает:

var leapYearPointInTime = new DateTime(2016, 2, 29); 

var closestDay2 = new DateTime 
(
    now.Year, 
    leapYearPointInTime.Month, 
    leapYearPointInTime.Day, 
    leapYearPointInTime.Hour, 
    leapYearPointInTime.Minute, 
    leapYearPointInTime.Second, 
    leapYearPointInTime.Millisecond 
); 

Есть простой способ, чтобы заставить это работать на високосный год? Я знаю:

DateTime.IsLeapYear 

и мог написать некоторый свернутый код, но, возможно, есть простой способ достичь вышеуказанного?

ответ

1

Я не уверен, что правильно понял ваш вопрос. Какой ближайший момент времени. Это будет 28 февраля или Мар-01? Я бы просто сделать это

DateTime now = DateTime.Now; 

var leapYearPointInTime = new DateTime(2016, 2, 29); 

if (DateTime.IsLeapYear(leapYearPointInTime.Year)) 
    if (2 == leapYearPointInTime.Month) 
     if (29 == leapYearPointInTime.Day) 
      leapYearPointInTime = leapYearPointInTime.Add(new TimeSpan(-1, 0, 0, 0)); 

var closestDay2 = new DateTime 
(
    now.Year, 
    leapYearPointInTime.Month, 
    leapYearPointInTime.Day, 
    leapYearPointInTime.Hour, 
    leapYearPointInTime.Minute, 
    leapYearPointInTime.Second, 
    leapYearPointInTime.Millisecond 
); 

не уверен, что это считается «запутанным» или даже считается ближайший момент времени, но я надеюсь, что это помогает

+0

Было бы 28 февраля 2017 года в год, например прыжок для closestDay2. Проблема заключается в том, что 2017 год не является високосным годом - поэтому используется исключение из 29 причин. – cs0815

+0

Ваш код будет работать, если вы используете AddDays (-1). Благодарю. По-прежнему кажется, что это сложно сделать в .net, не так ли? – cs0815

+0

Исправлена ​​ошибка. Поскольку DateTime является типом значения, вам нужно сохранить обновленное значение. Да, это выглядит немного беспорядочно ... – Benj

0

Я также не уверен, если я правильно понимаю, но мне кажется, что вы хотите получить на следующий день (если данная дата больше, чем текущая) или предыдущий день.

В этом случае было бы легче сделать просто:

 DateTime originalPointInTime ; 
     DateTime now ; 

     var addDay = originalPointInTime > now ? 1 :-1; 

     now.AddDays(addDay); 
Смежные вопросы