Пример #1
0
        internal static bool Evaluate(RPNContext context)
        {
            if (OPERATORS.Contains(context.Current))
            {
                switch (context.Current)
                {
                    case "date":
                        {
                            var len = context.Stack.Pop();
                            var parts = new List<int>();
                            for (var i = 0; i < len; i++)
                                parts.Add(Convert.ToInt32(context.Stack.Pop()));
                            parts.Reverse();

                            DateTime date = new DateTime();
                            date = date.AddYears(parts.Count > 0 ? parts[0] - 1 : 0);
                            date = date.AddMonths(parts.Count > 1 ? parts[1] - 1 : 0);
                            date = date.AddDays(parts.Count > 2 ? parts[2] - 1 : 0);
                            date = date.AddHours(parts.Count > 3 ? parts[3] : 0);
                            date = date.AddMinutes(parts.Count > 4 ? parts[4] : 0);
                            date = date.AddSeconds(parts.Count > 5 ? parts[5] : 0);
                            date = date.AddMilliseconds(parts.Count > 6 ? parts[6] : 0);

                            context.Stack.Push(date);
                            break;
                        }
                    case "days":
                    case "day":
                        {
                            var x = Convert.ToInt32(context.Stack.Pop());
                            var ts = new TimeSpan(x, 0, 0, 0);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "hours":
                    case "hour":
                        {
                            var x = Convert.ToInt32(context.Stack.Pop());
                            var ts = new TimeSpan(0, x, 0, 0);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "minutes":
                    case "minute":
                        {
                            var x = Convert.ToInt32(context.Stack.Pop());
                            var ts = new TimeSpan(0, 0, x, 0);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "seconds":
                    case "second":
                        {
                            var x = Convert.ToInt32(context.Stack.Pop());
                            var ts = new TimeSpan(0, 0, 0, x);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "month":
                    case "months":
                        {
                            var x = Convert.ToInt32(context.Stack.Pop());
                            var ts = new ExtendedTimeSpan(0, x);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "year":
                    case "years":
                        {
                            var x = Convert.ToInt32(context.Stack.Pop());
                            var ts = new ExtendedTimeSpan(x, 0);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "ts":
                        {
                            var s = Convert.ToInt32(context.Stack.Pop());
                            var m = Convert.ToInt32(context.Stack.Pop());
                            var h = Convert.ToInt32(context.Stack.Pop());
                            var d = Convert.ToInt32(context.Stack.Pop());
                            var ts = new TimeSpan(d, h, m, s);
                            context.Stack.Push(ts);
                            break;
                        }
                    case "+":
                        {
                            if (context.Stack.First() is TimeSpan)
                            {
                                return SumTimeSpan(context);
                            }

                            if (context.Stack.First() is ExtendedTimeSpan)
                            {
                                return SumExtendedTimeSpan(context);
                            }
                            return false;
                        }
                    case "-":
                        {
                            if (context.Stack.First() is TimeSpan)
                            {
                                return SubtractTimeSpan(context);
                            }

                            if (context.Stack.First() is ExtendedTimeSpan)
                            {
                                context.Stack.First().Invert();
                                return SumExtendedTimeSpan(context);
                            }
                            return false;
                        }
                }
                return true;
            }
            return false;
        }
Пример #2
0
        public int ToUnitCount(ExtendedTimeSpan timeSpan)
        {
            switch (TimeRulerUnit)
            {
                case TimeRulerUnit.Day:
                    return (int)Math.Floor(timeSpan.TotalDays);

                case TimeRulerUnit.Hour:
                    return (int)Math.Floor(timeSpan.TotalHours);

                case TimeRulerUnit.Minute:
                    return (int)Math.Floor(timeSpan.TotalMinutes);

                case TimeRulerUnit.Second:
                    return (int)Math.Floor(timeSpan.TotalSeconds);

                default:
                    return default(int);
            }
        }