Data e ora: ricevi martedì prossimo

Come posso ottenere la data del prossimo martedì?

In PHP, è semplice come strtotime('next tuesday'); .

Come posso ottenere qualcosa di simile in .NET

Come ho menzionato nei commenti, ci sono varie cose che potresti significare per “martedì prossimo”, ma questo codice ti dà “il prossimo martedì a verificarsi, o oggi se è già martedì”:

 DateTime today = DateTime.Today; // The (... + 7) % 7 ensures we end up with a value in the range [0, 6] int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) today.DayOfWeek + 7) % 7; DateTime nextTuesday = today.AddDays(daysUntilTuesday); 

Se vuoi dare “una settimana” se è già martedì, puoi usare:

 // This finds the next Monday (or today if it's Monday) and then adds a day... so the // result is in the range [1-7] int daysUntilTuesday = (((int) DayOfWeek.Monday - (int) today.DayOfWeek + 7) % 7) + 1; 

… oppure potresti usare la formula originale, ma da domani:

 DateTime tomorrow = DateTime.Today.AddDays(1); // The (... + 7) % 7 ensures we end up with a value in the range [0, 6] int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) tomorrow.DayOfWeek + 7) % 7; DateTime nextTuesday = tomorrow.AddDays(daysUntilTuesday); 

EDIT: solo per rendere questo bello e versatile:

 public static DateTime GetNextWeekday(DateTime start, DayOfWeek day) { // The (... + 7) % 7 ensures we end up with a value in the range [0, 6] int daysToAdd = ((int) day - (int) start.DayOfWeek + 7) % 7; return start.AddDays(daysToAdd); } 

Quindi, per ottenere il valore per “oggi o nei prossimi 6 giorni”:

 DateTime nextTuesday = GetNextWeekday(DateTime.Today, DayOfWeek.Tuesday); 

Per ottenere il valore per “il prossimo martedì escluso oggi”:

 DateTime nextTuesday = GetNextWeekday(DateTime.Today.AddDays(1), DayOfWeek.Tuesday); 

Questo dovrebbe fare il trucco:

 static DateTime GetNextWeekday(DayOfWeek day) { DateTime result = DateTime.Now.AddDays(1); while( result.DayOfWeek != day ) result = result.AddDays(1); return result; } 
 DateTime nextTuesday = DateTime.Today.AddDays(((int)DateTime.Today.DayOfWeek - (int)DayOfWeek.Tuesday) + 7); 

Ci sono meno soluzioni verbose e più intelligenti / eleganti a questo problema, ma la seguente funzione C # funziona molto bene per un certo numero di situazioni.

 ///  /// Find the closest weekday to the given date ///  /// if the supplied date is on the specified day of the week, return that date or continue to the next date /// search forward or backward from the supplied date. if a null parameter is given, the closest weekday (ie in either direction) is returned public static DateTime ClosestWeekDay(this DateTime date, DayOfWeek weekday, bool includeStartDate = true, bool? searchForward=true) { if (!searchForward.HasValue && !includeStartDate) { throw new ArgumentException("if searching in both directions, start date must be a valid result"); } var day = date.DayOfWeek; int add = ((int)weekday - (int)day); if (searchForward.HasValue) { if (add < 0 && searchForward.Value) { add += 7; } else if (add > 0 && !searchForward.Value) { add -= 7; } else if (add == 0 && !includeStartDate) { add = searchForward.Value ? 7 : -7; } } else if (add < -3) { add += 7; } else if (add > 3) { add -= 7; } return date.AddDays(add); } 
 DateTime nexttuesday=DateTime.Today.AddDays(1); while(nexttuesday.DayOfWeek!=DayOfWeek.Tuesday) nexttuesday = nexttuesday.AddDays(1); 

@Jon Skeet buona risposta.

Per il giorno precedente:

 private DateTime GetPrevWeekday(DateTime start, DayOfWeek day) { // The (... - 7) % 7 ensures we end up with a value in the range [0, 6] int daysToRemove = ((int) day - (int) start.DayOfWeek - 7) % 7; return start.AddDays(daysToRemove); } 

Grazie!!

Ora nel sapore oneliner – nel caso in cui è necessario passare come parametro in qualche meccanismo.

 DateTime.Now.AddDays(((int)yourDate.DayOfWeek - (int)DateTime.Now.DayOfWeek + 7) % 7).Day 

In questo caso specifico:

 DateTime.Now.AddDays(((int)DayOfWeek.Tuesday - (int)DateTime.Now.DayOfWeek + 7) % 7).Day 

Potrebbe essere anche un’estensione, tutto dipende

 public static class DateTimeExtensions { public static IEnumerable Next(this DateTime date, DayOfWeek day) { // This loop feels expensive and useless, but the point is IEnumerable while(true) { if (date.DayOfWeek == day) { yield return date; } date = date.AddDays(1); } } } 

uso

  var today = DateTime.Today; foreach(var monday in today.Next(DayOfWeek.Monday)) { Console.WriteLine(monday); Console.ReadKey(); } 

Versione Objective C:

 +(NSInteger) daysUntilNextWeekday: (NSDate*)startDate withTargetWeekday: (NSInteger) targetWeekday { NSInteger startWeekday = [[NSCalendar currentCalendar] component:NSCalendarUnitWeekday fromDate:startDate]; return (targetWeekday - startWeekday + 7) % 7; }