示例#1
0
 public static ArgumentUtilitiesHandle <DateTime> EnsureSameKind(this ArgumentUtilitiesHandle <DateTime> hnd, ArgumentUtilitiesHandle <DateTime> other)
 {
     DateTimeUtilities.EnsureSameKind(hnd.Value, other.Value, altDateAArgName: hnd.Name, altDateBArgName: other.Name);
     return(hnd);
 }
示例#2
0
        // TODO: Put strings into the resources.
        //
        public static void GetDatePeriod(this DateTimeOffset referenceDateTime, DatePeriodKind kind, out DateTimeOffset periodFrom, out DateTimeOffset periodUntil, ArgumentPlaceholder <DayOfWeek> firstDayOfWeek = default)
        {
            if (kind == DatePeriodKind.Any)
            {
                throw new ArgumentOutOfRangeException(nameof(kind));
            }
            //
            DateTimeOffset locPeriodFrom, locPeriodUntil;
            var            locFirstDayOfWeek = firstDayOfWeek.Substitute(value: CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek);
            var            referenceDate     =
                new DateTimeOffset(
                    year: referenceDateTime.Year,
                    month: referenceDateTime.Month,
                    day: referenceDateTime.Day,
                    hour: 0,
                    minute: 0,
                    second: 0,
                    offset: referenceDateTime.Offset);
            var referenceDateUntil = referenceDate.AddDays(1.0D);

            switch (kind)
            {
            case DatePeriodKind.CurrentMonth:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, referenceDate.Month, 1, 0, 0, 0, referenceDate.Offset);
                locPeriodUntil = locPeriodFrom.AddMonths(1);
                break;

            case DatePeriodKind.CurrentDay:
                locPeriodFrom  = referenceDate;
                locPeriodUntil = locPeriodFrom.AddDays(1.0);
                break;

            case DatePeriodKind.CurrentWeek:
                locFirstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
                locPeriodFrom     = referenceDate.AddDays(-(NumberOfDayOfWeek(referenceDate.DayOfWeek, locFirstDayOfWeek) - 1));
                locPeriodUntil    = locPeriodFrom.AddDays(7.0);
                break;

            case DatePeriodKind.CurrentQuarter:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, (int)Math.Ceiling(referenceDate.Month / 3.0D) * 3, 1, 0, 0, 0, referenceDate.Offset).AddMonths(-2);
                locPeriodUntil = locPeriodFrom.AddMonths(3);
                break;

            case DatePeriodKind.CurrentHalfOfYear:
                locPeriodFrom  = referenceDate.Month > 6 ? new DateTimeOffset(referenceDate.Year, 7, 1, 0, 0, 0, referenceDate.Offset) : new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset);
                locPeriodUntil = locPeriodFrom.AddMonths(6);
                break;

            case DatePeriodKind.CurrentYear:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset);
                locPeriodUntil = locPeriodFrom.AddYears(1);
                break;

            case DatePeriodKind.BeginOfMonth:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, referenceDate.Month, 1, 0, 0, 0, referenceDate.Offset);
                locPeriodUntil = referenceDateUntil;
                break;

            case DatePeriodKind.BeginOfWeek:
                locPeriodFrom  = referenceDate.AddDays(-(DateTimeUtilities.NumberOfDayOfWeek(referenceDate.DayOfWeek, locFirstDayOfWeek) - 1));
                locPeriodUntil = referenceDateUntil;
                break;

            case DatePeriodKind.BeginOfQuarter:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, (int)Math.Ceiling(referenceDate.Month / 3.0D) * 3, 1, 0, 0, 0, referenceDate.Offset).AddMonths(-2);
                locPeriodUntil = referenceDate;
                break;

            case DatePeriodKind.BeginOfHalfOfYear:
                locPeriodFrom  = referenceDate.Month > 6 ? new DateTimeOffset(referenceDate.Year, 7, 1, 0, 0, 0, referenceDate.Offset) : new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset);
                locPeriodUntil = referenceDateUntil;
                break;

            case DatePeriodKind.BeginOfYear:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset);
                locPeriodUntil = referenceDateUntil;
                break;

            case DatePeriodKind.PreviousDay:
                locPeriodFrom  = referenceDate.AddDays(-1);
                locPeriodUntil = referenceDate;
                break;

            case DatePeriodKind.PreviousWeek:
                locPeriodFrom  = referenceDate.AddDays(-(NumberOfDayOfWeek(referenceDate.DayOfWeek, locFirstDayOfWeek) + 6));
                locPeriodUntil = locPeriodFrom.AddDays(7.0);
                break;

            case DatePeriodKind.PreviousMonth:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, referenceDate.Month, 1, 0, 0, 0, 0, referenceDate.Offset).AddMonths(-1);
                locPeriodUntil = locPeriodFrom.AddMonths(1);
                break;

            case DatePeriodKind.PreviousQuarter:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, (int)Math.Ceiling(referenceDate.Month / 3.0D) * 3, 1, 0, 0, 0, referenceDate.Offset).AddMonths(-5);
                locPeriodUntil = locPeriodFrom.AddMonths(3);
                break;

            case DatePeriodKind.PreviousHalfOfYear:
                locPeriodFrom  = referenceDate.Month > 6 ? new DateTimeOffset(referenceDate.Year, 7, 1, 0, 0, 0, referenceDate.Offset).AddMonths(-6) : new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset).AddMonths(-6);
                locPeriodUntil = locPeriodFrom.AddMonths(6);
                break;

            case DatePeriodKind.PreviousYear:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset).AddYears(-1);
                locPeriodUntil = locPeriodFrom.AddYears(1);
                break;

            case DatePeriodKind.NextDay:
                locPeriodFrom  = referenceDate.AddDays(1);
                locPeriodUntil = locPeriodFrom.AddDays(1);
                break;

            case DatePeriodKind.NextWeek:
                locPeriodFrom  = referenceDate.AddDays(-(NumberOfDayOfWeek(referenceDate.DayOfWeek, locFirstDayOfWeek) - 8));
                locPeriodUntil = locPeriodFrom.AddDays(7.0);
                break;

            case DatePeriodKind.NextMonth:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, referenceDate.Month, 1, 0, 0, 0, 0, referenceDate.Offset).AddMonths(1);
                locPeriodUntil = locPeriodFrom.AddMonths(1);
                break;

            case DatePeriodKind.NextQuarter:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, (int)Math.Ceiling(referenceDate.Month / 3.0D) * 3, 1, 0, 0, 0, referenceDate.Offset).AddMonths(1);
                locPeriodUntil = locPeriodFrom.AddMonths(3);
                break;

            case DatePeriodKind.NextHalfOfYear:
                locPeriodFrom  = referenceDate.Month > 6 ? new DateTimeOffset(referenceDate.Year, 7, 1, 0, 0, 0, referenceDate.Offset).AddMonths(6) : new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset).AddMonths(6);
                locPeriodUntil = locPeriodFrom.AddMonths(6);
                break;

            case DatePeriodKind.NextYear:
                locPeriodFrom  = new DateTimeOffset(referenceDate.Year, 1, 1, 0, 0, 0, referenceDate.Offset).AddYears(1);
                locPeriodUntil = locPeriodFrom.AddYears(1);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(kind), $"Значение '{kind}' (тип '{kind.GetType().FullName}' не поддерживается).");
            }
            periodFrom  = locPeriodFrom;
            periodUntil = locPeriodUntil;
        }