hacer edad cumpleaños como calendario calcular c# datetime

c# - edad - Cómo determinar si el cumpleaños o aniversario ocurrió durante el intervalo de fechas



calcular edad sql (13)

Éste debería manejar correctamente los años bisiestos:

public static bool IsBirthdayInRange(DateTime birthday, DateTime from, DateTime to) { if (to < from) { throw new ArgumentException("The specified range is not valid"); } int year = from.Year; int month = birthday.Month; int day = birthday.Day; if (from.DayOfYear > to.DayOfYear && birthday.DayOfYear < from.DayOfYear) { year++; } if (month == 2 && day == 29 && !DateTime.IsLeapYear(year)) { // Assuming people born on February 29 celebrate their birthday // one day earlier on non-leap years day--; } DateTime bDate = new DateTime(year, month, day); return bDate >= from.Date && bDate <= to.Date; }

Dado que tengo un DateTime de cumpleaños / aniversario, ¿cómo puedo determinar si esa fecha ocurrió durante un intervalo de fechas específico? Por ejemplo,

Cumpleaños = 1/2/2000
Rango de fechas = 25/12/2008 - 1/3/2009

Necesito un método para determinar si el cumpleaños de esta persona ocurrió durante ese intervalo de fechas, preferiblemente en C #.

Primero fui a cambiar el año del DateTime de cumpleaños para que coincida con el rango de fechas, luego simplemente verifique si el DateTime de cumpleaños "nuevo" está entre la fecha de inicio y finalización del rango de fechas ... pero cuando el rango de fechas abarca diferentes años, Como en mi ejemplo anterior, tuve que agregar una declaración if desagradable. ¿No hay mejor manera?


¡¡¡Esto funcionara!!!

for(int i = startDate.year; i <= endDate.year; i++) { DateTime newBD = new DateTime(i, BD.month, BD.day); if((DateTime.Compare(newBD, startDate) >= 0) && (DateTime.Compare(newBD, endDate) <= 0)) { //gotcha break; } }


¿Supongo que sus fechas se almacenan en variables DateTime? Si es así, la comparación es bastante sencilla:

if (Birthday > DateRangeLower && Birthday < DateRangeUpper) { // it''s your birthday! }

Puede encapsular esto en un método de extensión si lo desea:

public static bool Between(this DateTime compareDate, DateTime startDate, DateTime endDate) { return compareDate > startDate && compareDate < endDate; }

entonces puedes llamarlo así:

if (Birthday.Between(DateRangeLower, DateRangeUpper) { // it''s your birthday }

Actualización : Si desea ignorar la parte del año del cumpleaños para determinar si el aniversario de la fecha está dentro del rango, aplique lo siguiente:

if (DateRangeLower.DayOfYear <= DateRangeUpper.DayOfYear && Birthday.DayOfYear > DateRangeLower.DayOfYear && Birthday.DayOfYear < DateRangeUpper.DayOfYear) { // it''s your birthday // the days are within the date range (and the range is in a single year) } else if (DateRangeLower.DayOfYear > DateRangeUpper.DayOfYear && Birthday.DayOfYear < DateRangeLower.DayOfYear && Birthday.DayOfYear > DateRangeUpper.DayOfYear) { // it''s your birthday // note, we''re actually checking to see if the date is outside of the // original date''s days to handle the case where the dates span a year end boundary // this only works if the dates are not more than 1 year apart }


Acabo de convertir todas las fechas a la época de la época, y luego hacer una comparación directa.

Encontré esta conversión here , ligeramente modificada.

int epoch = (int)({Beginning/Ending Date} - new DateTime(1970, 1, 1)).TotalSeconds;

Así que todo su conjunto de código sería simplemente

int StartDateInEpoch = (int)(StartDate - new DateTime(1970, 1, 1)).TotalSeconds; int EndDateInEpoch = (int)(EndDate - new DateTime(1970, 1, 1)).TotalSeconds; int TargetDateInEpoch = (int)(TargetDate - new DateTime(1970, 1, 1)).TotalSeconds; if (StartDateInEpoch < TargetDateInEpoch && TargetDateInEpoch <= EndDateInEpoch) return true;


Aquí está mi solución. Utiliza DayOfYear para encontrar una coincidencia. Pero debe tener cuidado, si el DayOfYear de DayOfYear de la fecha de inicio es más allá del DayOfYear de DayOfYear de la DayOfYear de finalización. Supongo que la fecha de inicio es anterior a la fecha de finalización:

private static bool HasBirthDay( DateTime birthday, DateTime start, DateTime end ) { Debug.Assert( start < end ); if( start.DayOfYear < end.DayOfYear ) { if( birthday.DayOfYear > start.DayOfYear && birthday.DayOfYear < end.DayOfYear ) { return true; } } else { if( birthday.DayOfYear < end.DayOfYear || birthday.DayOfYear > start.DayOfYear ) { return true; } } return false; } // DayOfYear(start date) > DayOfYear(end date) var start = new DateTime( 2008, 12, 25 ); var end = new DateTime( 2009, 1, 3 ); Debug.Assert( HasBirthDay( new DateTime( 2000, 1, 2 ), start, end ) ); Debug.Assert( HasBirthDay( new DateTime( 2000, 12, 26), start, end ) ); Debug.Assert( !HasBirthDay( new DateTime( 2000, 1, 5 ), start, end ) ); Debug.Assert( !HasBirthDay( new DateTime( 2000, 12, 24 ), start, end ) ); // DayOfYear(start date) < DayOfYear(end date) start = new DateTime( 2008, 10, 25 ); end = new DateTime( 2008, 11, 3 ); Debug.Assert( HasBirthDay( new DateTime( 2000, 10, 26 ), start, end ) ); Debug.Assert( !HasBirthDay( new DateTime( 2000, 12, 5 ), start, end ) ); Debug.Assert( !HasBirthDay( new DateTime( 2000, 1, 24 ), start, end ) );


Establezca el cumpleaños en el año = 2000, la fecha de inicio en el año = 2000 y la fecha en el año 2000. Si la fecha es anterior a la fecha de inicio, establezca la fecha en el año 2001.

Después de eso chanchullos, desde arriba:

if (Birthday > DateRangeLower && Birthday < DateRangeUpper) { // it''s your birthday! }


Ok aqui esta mi toma

public static bool IsBirthDayInRange(DateTime birthday, DateTime start, DateTime end) { DateTime temp = birthday.AddYears(start.Year - birthday.Year); if (temp < start) temp = temp.AddYears(1); return birthday <= end && temp >= start && temp <= end; }


Podría usar la propiedad DayOfYear de los objetos DateTime.

if ((birthday.DayOfYear >= start.DayOfYear) && (birthday.DayOfYear <= end.DayOfYear)) { ... }


Podrías ser el mejor para hacer un dibujo para esto.

El problema es fundamentalmente determinante si existe una N tal que el noveno cumpleaños de la persona se encuentre dentro del rango o no.

Podría tomar una línea de base y hacer un cálculo del número de días con un módulo, que manejaría la reinversión del año (pero los años bisiestos pueden causar errores off-by-one).

Otra alternativa que podría hacer una representación más simple es que, dado que los cumpleaños forman una cuadrícula 1-D en la línea del calendario, para que un cumpleaños NO esté dentro del rango, el rango debe estar completamente entre los cumpleaños de la persona en los años sucesivos: es decir, NO (BirthdayY1 <RangeStart && RangeEnd <BirthdayY2).

Por lo general, cuando hicimos este tipo de análisis fue en meses enteros, por lo que fue mucho más sencillo encontrar todos los cumpleaños en mayo, por ejemplo, para obtener tarjetas de cumpleaños.


Una respuesta diferente, moviendo todas las fechas a un año específico.

public static bool IsBirthDayInRange(DateTime birthday, DateTime start, DateTime end) { // This could be any date... var epoch = new DateTime(1970, 1, 1); // Start date is always epoch, end date is epoch + range span DateTime endDateInEpoch = epoch.AddSeconds((end - start).TotalSeconds); // Move the bithday back to epoch.Year DateTime birthDayInEpoch = birthday.AddYears(epoch.Year - birthday.Year); return birthday <= end && epoch < birthDayInEpoch && birthDayInEpoch <= endDateInEpoch; }


El quid de su problema es determinar qué año asignar al cumpleaños para asegurarse de que puede realizar una comparación de rango válida.

Tiene dos subcasas relacionadas con el rango que necesita para tratar:

  1. The LowerBound tiene el mismo año que UpperBound
  2. The LowerBound tiene un año diferente al UpperBound

EDITAR: No hay suficiente café. Ignorar mi respuesta anterior.

Debe ajustar las fechas según el mes / día del cumpleaños que está examinando.

No siempre se puede usar el año del límite superior porque el cumpleaños podría caer en un mes que sea mayor que el mes del límite superior. Una alternativa simple es realizar el control dos veces: una vez se usa el año del límite superior y luego se usa nuevamente el año anterior. Esto maneja los casos de los límites del año:

var birthday = DateTime.Parse( "1/2/2000" ); var lowerBound = DateTime.Parse( "12/25/2008" ); var upperBound = DateTime.Parse( "1/3/2009" ); var adjustA = new Birthday( upperBound.Year, birthday.Month, birthday.Day ); var adjustB = adjustA.AddYears( -1 ); var isInBounds = (adjustA >= lowerBound && adjustA <= upperBound) || (adjustB >= lowerBound && adjustB <= upperBound);


Respuesta actualizada para incluir la normalización del límite superior mencionada por SLC. Esto debería funcionar para los casos en que la persona no nace el 29/02.

DateTime birthday = new DateTime(2000, 2, 1); DateTime min = new DateTime(2008, 12, 25); DateTime max = new DateTime(2009, 3, 1); DateTime nLower = new DateTime(min.Year, birthday.Month, birthday.Day); DateTime nUpper = new DateTime(max.Year, birthday.Month, birthday.Day); if (birthday.Year <= max.Year && ((nLower >= min && nLower <= max) || (nUpper >= min && nUpper <= max))) { // Happy birthday Console.WriteLine("Happy birthday"); }

Y ahora una versión que maneja personas nacidas en el día (29/02):

public static bool IsBirthdayInRange( DateTime birthday, DateTime min, DateTime max) { var dates = new DateTime[] { birthday, min }; for (int i = 0; i < dates.Length; i++) { if (dates[i].Month == 2 && dates[i].Day == 29) { dates[i] = dates[i].AddDays(-1); } } birthday = dates[0]; min = dates[1]; DateTime nLower = new DateTime(min.Year, birthday.Month, birthday.Day); DateTime nUpper = new DateTime(max.Year, birthday.Month, birthday.Day); if (birthday.Year <= max.Year && ((nLower >= min && nLower <= max) || (nUpper >= min && nUpper <= max))) { return true; } return false; }


if (Birthday.Month >= DateRangeLower.Month && Birthday.Month <= DateRangeUpper.Month && Birthday.Day>= DateRangeLower.Day && Birthday.Day<= DateRangeUpper.Day) { //Partytime... }