using System; namespace Developpez.Dotnet { /// /// Permet d'utiliser des methodes d'extensions sur les types de Date. /// En particulier, permet d'utiliser des expressions "à la Ruby" en C# /// Par exemple, plutôt que de faire DateTime.Now.AddMinutes(5), on fera: /// 5.Minutes().FromNow() /// ) public static class DateExtensions { /// /// Retourne une durée correspondant au nombre de jours passé en paramètre /// /// Nombre de jours dans la période /// Une durée correspondant au nombre de jours spécifié public static TimeSpan Days(this int value) { return TimeSpan.FromDays(value); } /// /// Retourne une durée correspondant au nombre d'heures passé en paramètre /// /// Nombre de heures dans la période /// Une durée correspondant au nombre d'heures spécifié public static TimeSpan Hours(this int value) { return TimeSpan.FromHours(value); } /// /// Retourne une durée correspondant au nombre de minutes passé en paramètre /// /// Nombre de minutes dans la période /// Une durée correspondant au nombre de minutes spécifié public static TimeSpan Minutes(this int value) { return TimeSpan.FromMinutes(value); } /// /// Retourne une durée correspondant au nombre de secondes passé en paramètre /// /// Nombre de secondes dans la période /// Une durée correspondant au nombre de secondes spécifié public static TimeSpan Seconds(this int value) { return TimeSpan.FromSeconds(value); } /// /// Retourne une date correspondant à la durée précédant la date courante /// /// Durée que l'on veut soustraire a la date courante /// La date correspondant à la durée précédent la date courante public static DateTime Ago(this TimeSpan timeSpan) { return DateTime.Now - timeSpan; } /// /// Retourne une date correspondant à la durée suivant la date courante /// /// Durée que l'on veut ajouter a la date courante /// La date correspondant à la durée suivant la date courante public static DateTime FromNow(this TimeSpan timeSpan) { return DateTime.Now + timeSpan; } /// /// Retourne une date correspondant à la durée suivant la date de départ spécifiée /// /// Durée que l'on veut ajouter a la date de départ spécifiée /// Date de départ /// La date correspondant à la durée suivant la date de départ spécifiée public static DateTime From(this TimeSpan timeSpan, DateTime startDate) { return startDate + timeSpan; } /// /// Retourne une date correspondant à la durée précédent la date spécifiée /// /// Durée que l'on veut retrancher de la date spécifiée /// Date de fin /// La date correspondant à la durée précédent la date spécifiée public static DateTime Before(this TimeSpan timeSpan, DateTime endDate) { return endDate - timeSpan; } private static readonly DateTime _unixEpoch = new DateTime(1970, 1, 1); /// /// Convertit un DateTime en timestamp unix /// /// La date à convertir /// Le timestamp UNIX équivalent public static long ToUnixTimestamp(this DateTime dt) { TimeSpan span = dt - _unixEpoch; return (long)Math.Truncate(span.TotalSeconds); } /// /// Convertit un timestamp Unix (date de référence = epoch) en DateTime /// /// Le timestamp à convertir /// Le DateTime équivalent public static DateTime ToDateTime(this long timestamp) { return _unixEpoch.AddSeconds(timestamp); } /// /// Renvoie le prochain jour de la semaine spécifié à partir d'une date /// /// la date à partir de laquelle on recherche /// le jour de la semaine recherché /// Le prochain dayOfWeek spécifié à partir de la date public static DateTime Next(this DateTime from, DayOfWeek dayOfWeek) { int start = (int)from.DayOfWeek; int wanted = (int)dayOfWeek; if (wanted <= start) wanted += 7; return from.AddDays(wanted - start); } /// /// Renvoie le précédent jour de la semaine spécifié à partir d'une date /// /// la date à partir de laquelle on recherche /// le jour de la semaine recherché /// Le précédent dayOfWeek spécifié à partir de la date public static DateTime Previous(this DateTime from, DayOfWeek dayOfWeek) { int end = (int)from.DayOfWeek; int wanted = (int)dayOfWeek; if (wanted >= end) end += 7; return from.AddDays(wanted - end); } } }