Это мой эквивалент в Excel "функция eomonth" правильную функцию?


Я пытаюсь создать функцию, аналогичную в Excel функция eomonth функции в C#. Я написал следующее, Однако, я не совсем уверен, если это обеспечивает эквивалентную функциональность. Это мой эквивалент функцию Excel "функция eomonth" правильные и моих анализов достаточно?

public static DateTime EOMonth(this DateTime dateTime, int months = 0)
{
    DateTime firstDayOfTheMonth = new DateTime(dateTime.Year, dateTime.Month, 1);
    return firstDayOfTheMonth.AddMonths(1 + months).AddDays(-1);
}

Тесты

[Test]
public void EOMonth_For5jan2011WithNoAddedMonths_ReturnsLastDayOfJan() 
{
    var expectedDate = DateTime.Parse("31-Jan-2011");
    var currentDate = DateTime.Parse("5-Jan-2011");

    var result = currentDate.EOMonth();

    Assert.That(result, Is.EqualTo(expectedDate));
}

[Test]
public void EOMonth_For5jan2011With_1_AddedMonths_ReturnsLastDayOfFeb2011()
{
    var expectedDate = DateTime.Parse("28-Feb-2011");
    var currentDate = DateTime.Parse("5-Jan-2011");

    var result = currentDate.EOMonth(1);

    Assert.That(result, Is.EqualTo(expectedDate));
}

[Test]
public void EOMonth_For5jan2011WithNegative_1_AddedMonths_ReturnsLastDayOfFeb()
{
    var expectedDate = DateTime.Parse("31-Dec-2010");
    var currentDate = DateTime.Parse("5-Jan-2011");

    var result = currentDate.EOMonth(-1);

    Assert.That(result, Is.EqualTo(expectedDate));
}

 [Test]
 public void EOMonth_For28Feb2007_12_AddedMonths_ReturnsLastDayOfFeb2008()
 {
     var expectedDate = DateTime.Parse("29-Feb-2008");
     var currentDate = DateTime.Parse("28-Feb-2007");

     var result = currentDate.EOMonth(12);

     Assert.That(result, Is.EqualTo(expectedDate));
 }


1204
1
задан 14 сентября 2011 в 10:09 Источник Поделиться
Комментарии
1 ответ

Для вашей реализации, почему бы не использовать:

return ((new DateTime(dateTime.Year, dateTime.Month, 1)).AddMonths(1 + months).AddDays(-1));

Для меня это немного чище, но это может быть просто меня. Когда я создаю объект должен быть возвращен, я не фанат хранить его в переменной. Вместо этого, просто вернуть именно то, что ты хочешь, и покончим с этим.


Для ваших тестов:

Я не уверен, что это имеет значение в данном случае, поскольку вы опираетесь исключительно на встроенные методы, но я хотел создать тестовые случаи в феврале и марте для различных типов високосных лет. Что если я указываю 29 февраля в невисокосный год? Он работает на разных условиях високосный год? Я бы также создать тестовый случай на Новый год (декабрь и январь).

1
ответ дан 14 сентября 2011 в 01:09 Источник Поделиться