Рассчитать дни, оставшиеся до дня рождения?
У меня есть объект 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++;
}
Придется делать это только сейчас для программы. Это достаточно просто, в отличие от других методов, если вам нужно только целое число дней.