Как узнать, сколько четвертей есть между одной четвертью и другой в c # - PullRequest
0 голосов
/ 21 апреля 2011

Я создал класс под названием Kwartal (что переводится как Quarter) для использования в моей программе:

    public sealed class Kwartal {
        private DateTime _poczatekKwartalu;
        private DateTime _koniecKwartalu;
        private int _numerKwartalu;
        private int _rok;

        public Kwartal(int numer, DateTime dataod, DateTime datado) {
            _numerKwartalu = numer;
            _koniecKwartalu = datado;
            _poczatekKwartalu = dataod;
            _rok = dataod.Year;
        }
        public Kwartal() { }

        public int Numer {
            get { return _numerKwartalu; }
            set { _numerKwartalu = value; }
        }
        public DateTime DataPoczatkowa {
            get { return _poczatekKwartalu; }
            set { _poczatekKwartalu = value; }
        }
        public DateTime DataKoncowa {
            get { return _koniecKwartalu; }
            set { _koniecKwartalu = value; }
        }
        public int Rok {
            get { return _rok; }
            set { _rok = value; }
        }
    }

Это в основном определение для Quarter.Обычно я определяю это так:

Kwartal kwartal1 = new Kwartal(1, new DateTime(year, 1, 1), new DateTime(year, 3, 31));
Kwartal kwartal2 = new Kwartal(2, new DateTime(year, 4, 1), new DateTime(year, 6, 30));

Теперь мне было интересно, как я могу сделать математику на них.Например, у меня Quarter1 в 2011 году, а затем в Quarter3 в 2012 году. Я хотел бы узнать, сколько кварталов существует между Quarter1 и Quarter3.

Как kwartal2 - kwartal1 = 5

Ответы [ 7 ]

2 голосов
/ 21 апреля 2011

Нигде вы не определяете количество кварталов в году - без какого-либо свойства / константы, установленной для объекта Kwartal, как вы можете узнать, каким должно быть базовое значение для вашей операции вычитания?

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

k.QuarterCount = (k1.year * kwartal.base) + k1.quarter

тогда у вас есть целое число, чтобы вычесть из другого года.

1 голос
/ 16 июня 2011

Вы можете использовать DateDiff класса библиотеки периодов времени для .NET , учитывая культуру календаря:

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28

  DateDiff dateDiff = new DateDiff( date1, date2 );
  Console.WriteLine( "DateDiff.Quarters: {0}", dateDiff.Quarters );
  // > DateDiff.Quarters: 5
} // DateDiffSample
1 голос
/ 21 апреля 2011

Из вашего ответа я бы поступил следующим образом:

public static int zwrocRozniceMiedzyKwartalami(Kwartal kwartal1, Kwartal kwartal2) {
    var quartersPerYear = 4;
    var yearDifference = kwartal2.Rok - kwartal1.Rok;
    var differenceQuarters = (yearDifference * quartersPerYear) + (kwartal2.Numer - kwartal1.Numer);
    return differenceQuarters;
}

Думаю, это даст вам следующие ответы:

(Год1, Квартал1) - (Год2, Квартал2)= Разница

(2012, 2) - (2011, 1) = (2011 - 2012) * 4 + (1 - 2) = -4 + (-1) = -5 => (2011, 1) на 5 кварталов раньше (2012, 2)

(2014, 1) - (2018,3) = (2018 - 2014) * 4 + (3 - 1) = 16 + 2 = 18 => (2018,3) - 18 месяцев после (2014,1)

0 голосов
/ 21 апреля 2011

Вот так я и сделал. Кажется, работает нормально. Если у вас есть лучший способ, позвольте мне знать: -)

    public static int zwrocRozniceMiedzyKwartalami(Kwartal kwartal1, Kwartal kwartal2) {
        int quartersPerYear = 4;
        int differenceQuarters;
        int yearDifference = kwartal2.Rok - kwartal1.Rok;
        if (yearDifference == 0) {
            differenceQuarters = kwartal2.Numer - kwartal1.Numer;
            return differenceQuarters;
        } else if (yearDifference > 0) {
            differenceQuarters = (yearDifference * quartersPerYear) +  (kwartal2.Numer - kwartal1.Numer);
            return differenceQuarters;
        } else if (yearDifference < 0) {
            return -1;
        }
        return -1;  
    }
0 голосов
/ 21 апреля 2011

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

class DateTimeQuarter
{
    public DateTimeQuarter(DateTime date)
    {
        Date = date;
        Quarter = date.Month / 4 + 1;
    }
    public static int operator -(DateTimeQuarter lhs, DateTimeQuarter rhs)
    {
        double value = Convert.ToDouble(
            (rhs.Date.Year - lhs.Date.Year)) + (rhs.Quarter / 10.0) - (rhs.Quarter / 10.0);
        int result = 
            (Convert.ToInt32(value) * 4) + Convert.ToInt32(value - Math.Floor(value));
        return result;
    }
    public DateTime Date { get; set; }
    public int Quarter { get; set; }
}

static void Main(string[] args)
{
    DateTimeQuarter q1 = new DateTimeQuarter(new DateTime(2006, 04, 20));
    DateTimeQuarter q2 = new DateTimeQuarter(new DateTime(2007, 12, 25));

    int quarters = q1 - q2;
}
0 голосов
/ 21 апреля 2011

Я не уверен, что вы хотите этого достичь

DateTime quarter1 = new DateTime(2010, 3, 31); //end date of Q1 as you capture DataKoncowa 
DateTime quarter2 = new DateTime(2011, 3, 31);//end date of Q2 as you capture DataKoncowa 
TimeSpan ts = quarter2 - quarter1; //kwartal2.DataKoncowa  - kwartal1.DataKoncowa
int actualQuarters = ts.Days / (30 *3); //assuming quarter is 90 days

Это возвращает 4 .. что-то вроде того, что вы ожидаете

0 голосов
/ 21 апреля 2011

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

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

О, и тогда вы начинаете думать о часовых поясах, о летнем времени и т. Д. И вы должны прочитать эту запись в блоге от Джона Скита .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...