简体   繁体   English

确定DateTime是否在给定的日期范围内

[英]Determine if DateTime is in a given Date Range

Aries          March 21 to April 20.
Taurus         April 21 to May 20.
Gemini         May 21 to June 21.

I need to print the Astrological sign of a user by getting the user's birth month and the date as inputs. 我需要通过获取用户的出生月份和日期作为输入来打印用户的占星符号。 How can I get the date range? 如何获取日期范围?

EX: March 21 to April 20 例:3月21日至4月20日

You don't actually need to construct a datetime range to solve this. 您实际上不需要构造日期时间范围来解决此问题。 A simple switch statement based on the month with a simple if statement for each month that returns one of two star signs will suffice. 一个基于月份的简单switch语句就足够了,每个月都有一个简单的if语句,该语句返回两个星号之一。

   e.g
     switch (month)
     {
       case 1:
          if (day <20) return "Capricorn"; else return "Aquarius";
          break;
       case 2:
          ...

This is the implementation of the method: 这是该方法的实现:

    private string GetHoroName(DateTime dt)
    {
        int month = dt.Month;
        int day = dt.Day;
        switch (month)
        {
            case 1:
                if (day <= 19)
                    return "Capricorn";
                else
                    return "Aquarius";

            case 2:
                if (day <= 18)
                    return "Aquarius";
                else
                    return "Pisces";
            case 3:
                if (day <= 20)
                    return "Pisces";
                else
                    return "Aries";
            case 4:
                if (day <= 19)
                    return "Aries";
                else
                    return "Taurus";
            case 5:
                if (day <= 20)
                    return "Taurus";
                else
                    return "Gemini";
            case 6:
                if (day <= 20)
                    return "Gemini";
                else
                    return "Cancer";
            case 7:
                if (day <= 22)
                    return "Cancer";
                else
                    return "Leo";
            case 8:
                if (day <= 22)
                    return "Leo";
                else
                    return "Virgo";
            case 9:
                if (day <= 22)
                    return "Virgo";
                else
                    return "Libra";
            case 10:
                if (day <= 22)
                    return "Libra";
                else
                    return "Scorpio";
            case 11:
                if (day <= 21)
                    return "Scorpio";
                else
                    return "Sagittarius";
            case 12:
                if (day <= 21)
                    return "Sagittarius";
                else
                    return "Capricorn";
        }
        return "";
    }

Create a class that describes a star sign... 创建一个描述星号的类...

class StarSign
{
    public string Name {get;set;}

    public DateTime StartDate {get;set;}

    public DateTime EndDate {get;set;}

    public bool CoversDate(DateTime birthday)
    {
        return birthday <= this.EndDate && birthday >= this.StartDate;
    }
}

I know I missed the boat on getting the accepted answer, but after giving Kirk Broadhurst a lashing I thought I better provide my own answer. 我知道我错过了获得公认答案的机会,但是在给柯克·布罗德赫斯特(Kirk Broadhurst)抨击之后,我认为我最好提供自己的答案。

My reading of the question was that chamara wanted something like this: 我对问题的理解chamara需要这样的东西:

var birthDate = new DateTime(1923, 4, 20);
var starSign = StarSigns.GetFor(birthDate);

Console.WriteLine(starSign); // Taurus (April 20 - May 20)
Console.WriteLine(starSign.GetStartDate(2010)); // 2010/04/20 00:00:00
Console.WriteLine(starSign.GetEndDate(2010)); // 2010/05/20 23:59:59

var starSign1 = StarSigns.GetFor(10, 22);
var starSign2 = StarSigns.GetFor(10, 23);

Console.WriteLine(starSign1); // Libra (September 23 - October 22)
Console.WriteLine(starSign2); // Scorpio (October 23 - November 21)

So here are my classes: 所以这是我的课程:

public static class StarSigns
{
    private static StarSign[] _starSigns;

    static StarSigns()
    {
        var names = new[]
        {
            "Aquarius", "Pisces", "Aries", "Taurus",
            "Gemini", "Cancer", "Leo", "Virgo",
            "Libra", "Scorpio", "Sagittarius", "Capricorn", 
        };

        var days = new[]
        {
            20, 18, 20, 20,
            21, 21, 22, 23,
            23, 23, 22, 22,
        };

        _starSigns = (from i in Enumerable.Range(0, 12)
                      let name = names[i]
                      let startMonth = i + 1
                      let startDay = days[i]
                      let endDay = days[(i + 1) % 12] - 1
                      select new StarSign(name, startMonth, startDay, endDay)).ToArray();
    }

    public static StarSign GetFor(DateTime birthDate)
    {
        return (from starSign in _starSigns
                let startDate = starSign.GetStartDate(birthDate.Year)
                let endDate = starSign.GetEndDate(birthDate.Year)
                where startDate <= birthDate
                where endDate >= birthDate
                select starSign).Single();
    }

    public static StarSign GetFor(int birthMonth, int birthDay)
    {
        return GetFor(new DateTime(2010, birthMonth, birthDay));
    }

}

public class StarSign
{
    public StarSign(string name, int startMonth, int startDay, int endDay)
    {
        this.Name = name;
        this.StartMonth = startMonth;
        this.StartDay = startDay;
        this.EndDay = endDay;
    }

    public string Name { get; private set; }

    public int StartDay { get; private set; }
    public int EndDay { get; private set; }

    public int StartMonth { get; private set; }

    public int EndMonth
    {
        get
        {
            return this.StartMonth + 1;
        }
    }

    public DateTime GetStartDate(int year)
    {
        return new DateTime(year, this.StartMonth, this.StartDay);
    }

    public DateTime GetEndDate(int year)
    {
        var nextStart = new DateTime(year, (this.StartMonth % 12) + 1, this.EndDay + 1);
        return nextStart.Subtract(TimeSpan.FromTicks(1));
    }

    public string Period
    {
        get
        {
            var startDate = this.GetStartDate(2010);
            var endDate = this.GetEndDate(2010);
            var template = "{0:MMMM dd} - {1:MMMM dd}";
            return String.Format(template, startDate, endDate);
        }
    }

    public override string ToString()
    {
        return String.Format("{0} ({1})", this.Name, this.Period);
    }
}

Enjoy! 请享用!

Haven't tested this but it looks right... :) 还没有测试过,但是看起来不错... :)

    private static string GetStarSign(DateTime dateOfBirth)
    {
        int[] fromDate = { 21, 20, 21, 21, 22, 22, 23, 23, 22, 23, 22, 22 };
        string[] signs = { "Capricorn", "Aquarius", "Pisces", "Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn" };
        if (dateOfBirth.Day < fromDate[dateOfBirth.Month - 1])
            return signs[dateOfBirth.Month - 1];
        return signs[dateOfBirth.Month];
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM