sth

A thing that is thought to be important or worth taking notice of.

Decade Calendar

C#

public struct DecadeDate
{
    public DecadeDate()
        : this(DateTime.Now)
    {
    }

    public DecadeDate(DateTime date)
    {
        Year = date.Year;
        DayOfYear = date.DayOfYear;
        var day = date.DayOfYear + 1;
        Decade = day / 10;
        Day = day % 10;
    }

    public DecadeDate(int year, int day)
        : this(year, 0, day)
    {
    }

    public DecadeDate(int year, int decade, int day)
        : this(CreateDateTime(year, decade, day))
    {
    }

    public int Year { get; }

    public int Decade { get; }

    public int Day { get; }

    public int DayOfYear { get; }

    public bool IsOddDay => Day % 2 == 1;

    public bool IsEvenDay => Day % 2 == 0;

    public DecadeDate AddDays(int days)
    {
        var date = (DateTime)this;
        date = date.AddDays(days);
        return new DecadeDate(date);
    }

    public DecadeDate AddDecade(int decades)
    {
        var date = (DateTime)this;
        date = date.AddDays(decades * 10);
        return new DecadeDate(date);
    }

    public DecadeDate AddYears(int years)
    {
        var date = (DateTime)this;
        date = date.AddYears(days);
        return new DecadeDate(date);
    }

    public override string ToString()
        => $"{Year}/${Day:00}";
    
    public static bool TryParse(string s, out DecadeDate result)
    {
        s = s?.Trim()?.ToLowerInvariant();
        if (string.IsNullOrEmpty(s))
        {
            result = default;
            return false;
        }

        var arr = s.Split('/');
        if (arr.Length < 2
            || !int.TryParse(arr[0], out var y)
            || !int.TryParse(arr[1], out var d))
        {
            result = default;
            return false;
        }

        try
        {
            result = new DecadeDate(y, d);
            return true;
        }
        catch (ArgumentException)
        {
            result = default;
            return false;
        }
    }

    public static DecadeDate? TryParse(string s)
    {
        if (TryParse(s, out var d)) return d;
        return null;
    }

    public static DecadeDate Parse(string s)
    {
        if (TryParse(s, out var d)) return d;
        throw new FormatException("s is invalid");
    }

    public static explicit operator DateTime(DecadeDate d)
    {
        var date = new Date(year, 1, 1);
        date.AddDays(dd.DayOfYear - 1);
        return date;
    }

    private static DateTime CreateDateTime(int year, int decade, int day)
    {
        var date = new Date(year, 1, 1);
        date.AddDays(decade * 10 + day - 1);
        return date;
    }
}

© Kingcean Tuan, 2021.

< Back to article