вычисление различия в месяцах между двумя датами

Одним из способов было бы получить массив осей, используя g.axes. Затем получите последние оси в массиве и установите xlabel этих осей:

last_ax = g.axes.flat[-1]
last_ax.set_xlabel("x in [m]")

enter image description here

121
задан Hamid Pourjam 19 April 2015 в 08:15
поделиться

8 ответов

Вы не сможете получить это из TimeSpan , потому что «месяц» - это переменная единица измерения. Вам придется рассчитать это самостоятельно, и вам нужно будет выяснить, как именно вы хотите, чтобы это работало.

Например, должны ли даты типа 5 июля 2009 г. и 4 августа 2009 г. давать разницу в один месяц или ноль месяцев? Если вы говорите, что он должен дать один, то как насчет 31 июля 2009 г. и 1 августа 2009 г. ? , что месяц? Это просто разница значений Месяц для дат или это больше связано с фактическим промежутком времени? Логика определения всех этих правил нетривиальна, поэтому вам придется определить свое собственное и реализовать соответствующий алгоритм.

Если все, что вам нужно, это просто разница в месяцах - полностью игнорируя значения даты - тогда вы можете использовать это:

public static int MonthDifference(this DateTime lValue, DateTime rValue)
{
    return (lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year);
}

Обратите внимание, что это возвращает относительную разницу, что означает, что if rValue больше, чем lValue , то возвращаемое значение будет отрицательным. Если вам нужна абсолютная разница, вы можете использовать это:

public static int MonthDifference(this DateTime lValue, DateTime rValue)
{
    return Math.Abs((lValue.Month - rValue.Month) + 12 * (lValue.Year - rValue.Year));
}
215
ответ дан 24 November 2019 в 01:28
поделиться

Мое взятие на этот ответ также использование дополнительный метод , но это может возвратить положительный или отрицательный результат.

public static int MonthsBefore(this DateTime dt1, DateTime dt2)
{
    (DateTime early, DateTime late, bool dt2After) = dt2 > dt1 ? (dt1,dt2,true) : (dt2,dt1,false);
    DateTime tmp; // Save the result so we don't repeat work
    int months = 1;
    while ((tmp = early.AddMonths(1)) <= late)
    {
        early = tmp;
        months++;
    }
    return (months-1)*(dt2After ? 1 : -1);
}

Пара тестов:

// Just under 1 month's diff
Assert.AreEqual(0, new DateTime(2014, 1, 1).MonthsBefore(new DateTime(2014, 1, 31)));
// Just over 1 month's diff
Assert.AreEqual(1, new DateTime(2014, 1, 1).MonthsBefore(new DateTime(2014, 2, 2)));    
// Past date returns NEGATIVE
Assert.AreEqual(-6, new DateTime(2012, 1, 1).MonthsBefore(new DateTime(2011, 6, 10)));
0
ответ дан 24 November 2019 в 01:28
поделиться

http://www.astro.uu.nl/~strous/AA/en/reken/juliaansedag.html

Если вы можете преобразовать время из григорианской даты в Номер дня по юлианскому календарю , вы можете просто создать оператор для сравнения номера дня по юлианскому календарю, который может иметь тип double, чтобы получать месяцы, дни, секунды и т. Д. По указанной выше ссылке можно найти алгоритм преобразования из С григорианского на юлианский.

0
ответ дан 24 November 2019 в 01:28
поделиться

Если вам нужно точное число, вы не можете использовать только временной интервал , поскольку вам нужно знать, с какими месяцами вы работаете и имеете ли вы дело с високосным годом, как вы и сказали.

Либо укажите приблизительное число, либо немного поиграйте с исходными DateTimes

0
ответ дан 24 November 2019 в 01:28
поделиться

Вам нужно решить это самостоятельно, вне зависимости от даты и времени. То, как вы будете справляться с «тупиками» в конце, будет зависеть от того, для чего вы хотите их использовать.

Один из способов - подсчитать месяц, а затем исправить дни в конце. Что-то вроде:

   DateTime start = new DateTime(2003, 12, 25);
   DateTime end = new DateTime(2009, 10, 6);
   int compMonth = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);
   double daysInEndMonth = (end - end.AddMonths(1)).Days;
   double months = compMonth + (start.Day - end.Day) / daysInEndMonth;
8
ответ дан 24 November 2019 в 01:28
поделиться

Я бы сделал это так:

static int TotelMonthDifference(this DateTime dtThis, DateTime dtOther)
{
    int intReturn = 0;

    dtThis = dtThis.Date.AddDays(-(dtThis.Day-1));
    dtOther = dtOther.Date.AddDays(-(dtOther.Day-1));

    while (dtOther.Date > dtThis.Date)
    {
        intReturn++;     
        dtThis = dtThis.AddMonths(1);
    }

    return intReturn;
}
3
ответ дан 24 November 2019 в 01:28
поделиться

Для начала вам нужно определить, что вы подразумеваете под TotalMonths.
Простое определение помещает месяц в 30,4 дня (365,25 / 12).

Помимо этого, любое определение, включая дроби, кажется бесполезным, и более распространенное целочисленное значение (целые месяцы между датами) также зависит от нестандартных бизнес-правил.

9
ответ дан 24 November 2019 в 01:28
поделиться

Возможно, вы не хотите знать дробные числа месяца; А как насчет этого кода?


public static class DateTimeExtensions
{
    public static int TotalMonths(this DateTime start, DateTime end)
    {
        return (start.Year * 12 + start.Month) - (end.Year * 12 + end.Month);
    }
}

//  Console.WriteLine(
//     DateTime.Now.TotalMonths(
//         DateTime.Now.AddMonths(-1))); // prints "1"


28
ответ дан 24 November 2019 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: