QUIKSharp icon indicating copy to clipboard operation
QUIKSharp copied to clipboard

Операторы работы с Датой. QuikDateTime перегрузка операторов сравнения.

Open iflash5 opened this issue 5 years ago • 2 comments

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

       // выбрать свечи за период 
        public IEnumerable<Candle> GetCandlesByPeriod(QuikDateTime from, QuikDateTime to)
        {
            return Candles.Where(x => x.Datetime >= from && x.Datetime < to);
        }

или так

// Добавить один день к дате

  var today = DateTime.Now;

   var from = new QuikDateTime
            {
                year = today.Year,
                month = today.Month,
                day = today.Day
            }.AddDays(-1);

реализация приблизительно такая + комменты


public class QuikDateTime : IComparable<QuikDateTime>
    {
...

        public int CompareTo(QuikDateTime qdt2)
        {
            if (year < qdt2.year) return -1;
            if (year > qdt2.year) return 1;

            if (month < qdt2.month) return -1;
            if (month > qdt2.month) return 1;

            if (day < qdt2.day) return -1;
            if (day > qdt2.day) return 1;

            if (hour < qdt2.hour) return -1;
            if (hour > qdt2.hour) return 1;

            if (min < qdt2.min) return -1;
            if (min > qdt2.min) return 1;

            if (sec < qdt2.sec) return -1;
            if (sec > qdt2.sec) return 1;

            if (ms < qdt2.ms) return -1;
            if (ms > qdt2.ms) return 1;

            if (mcs < qdt2.mcs) return -1;
            if (mcs > qdt2.mcs) return 1;

            return 0;
        }

        public override bool Equals(object obj)
        {
            var qdt2 = obj as QuikDateTime;
            if (qdt2 == null) throw new InvalidCastException();

            return CompareTo(qdt2) == 0;
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }


        public static bool operator >=(QuikDateTime qdt1, QuikDateTime qdt2)
        {
            return qdt1.CompareTo(qdt2) != -1;
        }

        public static bool operator <=(QuikDateTime qdt1, QuikDateTime qdt2)
        {
            return qdt1.CompareTo(qdt2) != 1;
        }

        public static bool operator <(QuikDateTime qdt1, QuikDateTime qdt2)
        {
            return qdt1.CompareTo(qdt2) == -1;
        }

        public static bool operator >(QuikDateTime qdt1, QuikDateTime qdt2)
        {
            return qdt1.CompareTo(qdt2) == 1;
        }

        public static bool operator ==(QuikDateTime qdt1, QuikDateTime qdt2)
        {
            if (qdt1 == null || qdt2 == null) throw new NullReferenceException();

            return qdt1.CompareTo(qdt2) == 0;
        }

        public static bool operator !=(QuikDateTime qdt1, QuikDateTime qdt2)
        {
            return !(qdt1 == qdt2);
        }

iflash5 avatar Sep 05 '19 14:09 iflash5

Вместо свойства DateTime пользуюсь парочкой методов расширения DateTime()

public static DateTime DateTime(this QuikDateTime qdt) =>
 new DateTime(qdt.year, qdt.month, qdt.day, qdt.hour, qdt.min, qdt.sec, qdt.ms);
public static DateTime DateTime(this Candle qdt) =>
 new DateTime(qdt.Datetime.year, qdt.Datetime.month, qdt.Datetime.day, qdt.Datetime.hour, qdt.Datetime.min, qdt.Datetime.sec, qdt.Datetime.ms);

SkyQuant avatar Jan 30 '20 16:01 SkyQuant

Позволю себе добавить ещё один extension, только на этот раз для стакана

public static DateTime DateTime(this OrderBook orderbook) => 
     new DateTime(1970, 1, 1).AddMilliseconds(orderbook.LuaTimeStamp).ToLocalTime();

SkyQuant avatar Feb 11 '20 14:02 SkyQuant