2010-10-15 6 views
1
Aries   March 21 to April 20. 
Taurus   April 21 to May 20. 
Gemini   May 21 to June 21. 

Мне нужно распечатать астрологический знак пользователя, установив месяц рождения и дату ввода в качестве входных данных. Как я могу получить диапазон дат?Определите, соответствует ли DateTime данному диапазону дат

EX: 21 марта по 20 апреля

ответ

9

Вы на самом деле не нужно построить ряд DATETIME, чтобы решить эту проблему. Простой оператор switch, основанный на месяце с простой операцией if за каждый месяц, который возвращает один из двух звездных знаков, будет достаточным.

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

yap ... thanks 4 da answer – chamara

+0

На стороне примечания: Я думаю, что логика, которую вы используете для вычисления знака зодиака, неверна :-) .. То, что вы подсчитали, есть созвездие за солнцем. Знак зодиака не тот, и это звездное созвездие, которое поднимается на восточном горизонте во время рождения. –

0

Создать класс, который описывает знак зодиака ...

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; 
    } 
} 
+2

И насколько хорошо это будет работать для Козерога? 22 декабря - 19 января ?? –

+0

Я не очень понимаю ваш ответ. Возможно, пожалуйста, объясните немного больше. – chamara

+1

@ 'Kirk Broadhurst' - Это не отвечает на вопрос, как указано. Я прочитал его как требующий функции с этой сигнатурой: «StarSign GetStarSign (int birthMonth, int birthDay)». Вы не принимаете во внимание, что 'DateTime' имеет год, а также компонент времени. Если бы я перешел в '# 5/20/2010 11: 23 #' в ваш метод 'CoversDate', я бы не получил никакого соответствия' StarSign', даже игнорируя проблему с годом. – Enigmativity

0

Я знаю, что я пропустил лодку на получение принятого ответа, но после того, как давать Kirk Broadhurst хлестать я думал, лучше предоставить свой собственный ответ.

Мое чтение вопроса в том, что 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) 

Так вот мои классы:

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!

+1

Помните принцип KISS. – jmservera

+0

@ 'jmservera' - Да, API довольно прост. Реализация минимальна, но надежна. Было бы слишком сложно злоупотреблять этим классом. Итак, я согласен, что это отличный пример KISS в действии. – Enigmativity

6

Это реализация метода:

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 ""; 
    } 
0

Не проверял это, но это выглядит так ... :)

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]; 
    } 
Смежные вопросы