Рассчитать дни, оставшиеся до дня рождения?

У меня есть объект DateTime с днем ​​рождения человека. Я создал этот объект, используя человека год, месяц и день рождения, следующим образом:

DateTime date = new DateTime(year, month, day);

Я хотел бы знать, сколько дней осталось до этого человека на следующий день рождения. Каков наилучший способ сделать это в С# (я новичок в языке)?

Ответ 1

// birthday is a DateTime containing the birthday

DateTime today = DateTime.Today;
DateTime next = new DateTime(today.Year,birthday.Month,birthday.Day);

if (next < today)
    next = next.AddYears(1);

int numDays = (next - today).Days;

Этот тривиальный алгоритм терпит неудачу, если день рождения - 29 февраля. Это альтернатива (которая по сути совпадает с ответом Себа Нильсона:

DateTime today = DateTime.Today;
DateTime next = birthday.AddYears(today.Year - birthday.Year);

if (next < today)
    next = next.AddYears(1);

int numDays = (next - today).Days;

Ответ 2

Использование сегодняшнего дня и дня рождения месяца и дня не будет работать с високосными годами.

После небольшого тестирования, это то, что я получаю:

private static int GetDaysUntilBirthday(DateTime birthday) {
    var nextBirthday = birthday.AddYears(DateTime.Today.Year - birthday.Year);
    if(nextBirthday < DateTime.Today) {
        nextBirthday = nextBirthday.AddYears(1);
    }
    return (nextBirthday - DateTime.Today).Days;
}

Протестировано с 29 февраля в високосный год, а также когда день рождения в тот же день.

Ответ 3

Это основано на ответе Филиппа Лейбарта выше, но обрабатывает один дополнительный случай края, который я не вижу в любом из предыдущих ответов.

Края, к которой я обращаюсь, - это когда день рождения в високосный день, день рождения в прошлом для текущего года, а текущий год не високосный год, а следующий год.

В текущем ответе будет меньше одного дня, так как он будет установлен "дальше" до 28 февраля текущего года, а затем добавит год, в который будет введена дата 28 февраля високосного года (что неверно). Изменение одной строки обрабатывает этот краевой регистр.

DateTime today = DateTime.Today;
DateTime next = birthday.AddYears(today.Year - birthday.Year);

if (next < today)
{
    if (!DateTime.IsLeapYear(next.Year + 1))
        next = next.AddYears(1);
    else
        next = new DateTime(next.Year + 1, birthday.Month, birthday.Day);
}

int numDays = (next - today).Days;

Обновление: Отредактировано на Филиппа, указывая, что мой код имел довольно значительный недостаток.

Ответ 4

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Parse("09/08/2012");
            DateTime dt2 = DateTime.Parse(DateTime.Now.ToString());
            int days = (dt2 - dt1).Days;
            Console.WriteLine(days);

            double month = (dt2 - dt1).Days / 30;
            Console.WriteLine(month);
            double year = (dt2 - dt1).Days / 365;
            Console.WriteLine(year);
            Console.Read();
        }
    }
}

Ответ 5

Попробуйте этот метод

private int GetDaysBeforeBirthday(DateTime birthdate)
{
    DateTime nextBday = new DateTime(DateTime.Now.Year, birthdate.Month, birthdate.Day);
    if (DateTime.Today > nextBday)
        nextBday = nextBday.AddYears(1);
    return (nextBday - DateTime.Today).Days;
}

просто передайте дату своего рождения, и он вернет оставшиеся дни до вашего следующего дня рождения.

Ответ 6

        DateTime Variable = DateTime.Now;
        int NumOfDaysTillNextMonth = 0;
        while (Variable < Comparer) //Comparer is just a target datetime
        {
            Variable = Variable.AddDays(1);
            NumOfDaysTillNextMonth++;
        }

Придется делать это только сейчас для программы. Это достаточно просто, в отличие от других методов, если вам нужно только целое число дней.