Comment puis-je trouver le début de la semaine (dimanche et lundi) en connaissant uniquement l'heure actuelle en C #?
Quelque chose comme:
DateTime.Now.StartWeek(Monday);
Utilisez une méthode d'extension. Ils sont la réponse à tout, tu sais! ;)
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
}
Qui peut être utilisé comme suit:
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
dt
est UTC et est déjà le début de la semaine, par exemple,2012-09-02 16:00:00Z
qui estMon, 03 Sep 2012 00:00:00
en heure locale. Il doit donc se convertirdt
à l'heure locale ou faire quelque chose d'un peu plus intelligent. Il devrait également renvoyer le résultat en UTC si l'entrée était UTC.DateTime.Parse("2012-09-02 16:00:00Z")
renvoie l'équivalent heure locale, et cette méthode renvoie correctement la même heure, comme une heure locale. Si vous utilisezDateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
pour passer explicitement l'heure UTC, cette méthode renvoie correctement 6 jours, 16 heures plus tôt, comme heure UTC. Cela fonctionne exactement comme je m'y attendais.dt
. J'ai utiliséint diff = dt.Date.DayOfWeek - startOfWeek;
Le moyen le plus rapide que je puisse trouver est:
Si vous souhaitez qu'un autre jour de la semaine soit votre date de début, il vous suffit d'ajouter la valeur DayOfWeek à la fin
la source
Un peu plus verbeux et sensible à la culture:
la source
CultureInfo.CurrentCulture
au lieu de la retirer du fil comme ça. Cela semble être une façon étrange d'y accéder.Now
propriété deux fois. Si l'heure actuelle se passe à minuit (ou minuit) entre les deux appels, la date aura changé.Utilisation de Fluent DateTime :
la source
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Moche mais ça donne au moins les bonnes dates
Avec début de semaine réglé par le système:
Sans pour autant:
la source
Combinons la réponse sans danger pour la culture et la réponse de la méthode d'extension:
la source
dt
place deDateTime.Today
, pour envelopper les mathématiques dans un(offset + 7) % 7
pour assurer un décalage négatif, pour utiliser une surcharge de méthode à paramètre unique qui passeFirstDayOfWeek
l'startOfWeek
argument de la culture actuelle et éventuellement (selon la spécification) pour contraindre un décalage de zéro à un décalage de 7 jours, de sorte que «mardi dernier» ne revient pas aujourd'hui si c'est déjà mardi.Cela vous donnerait le dimanche précédent (je pense):
la source
Cela peut être un peu un hack, mais vous pouvez convertir la propriété .DayOfWeek en un int (c'est une énumération et comme son type de données sous-jacent n'a pas été modifié, il est par défaut int) et l'utiliser pour déterminer le début de la semaine précédente .
Il semble que la semaine spécifiée dans l'énumération DayOfWeek commence le dimanche, donc si nous soustrayons 1 de cette valeur, ce sera égal au nombre de jours le lundi avant la date actuelle. Nous devons également mapper le dimanche (0) à 7, donc étant donné 1 - 7 = -6, le dimanche sera mappé au lundi précédent: -
Le code du dimanche précédent est plus simple car nous n'avons pas à faire cet ajustement: -
la source
Pour lundi
Pour dimanche
la source
la source
Mettre tout cela ensemble, avec la mondialisation et permettre de spécifier le premier jour de la semaine dans le cadre de l'appel que nous avons
la source
la source
Cela vous donnerait minuit le premier dimanche de la semaine:
Cela vous donne le premier lundi à minuit:
la source
essayez avec cela en c # .Avec ce code, vous pouvez obtenir à la fois la première date et la dernière date d'une semaine donnée.Ici, le dimanche est le premier jour et le samedi est le dernier jour, mais vous pouvez définir les deux jours en fonction de votre culture
la source
J'ai essayé plusieurs mais n'a pas résolu le problème avec une semaine commençant un lundi, ce qui m'a donné le lundi suivant un dimanche. Je l'ai donc modifié un peu et l'ai fait fonctionner avec ce code:
la source
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Étape 1: créer une classe statique
Étape 2: utilisez cette classe pour obtenir le jour de début et de fin de la semaine
la source
(6 - (dt.DayOfWeek - startOfWeek)) % 7
pour moi contre les tests unitaires que j'ai écrits.La méthode suivante doit renvoyer le DateTime souhaité. Passe vrai pour dimanche étant le premier jour de la semaine, faux pour lundi:
la source
Merci pour les exemples. J'avais besoin de toujours utiliser le "CurrentCulture" le premier jour de la semaine et pour un tableau, j'avais besoin de connaître le Daynumber exact .. alors voici mes premières extensions:
la source
Personne ne semble avoir répondu correctement à cette question. Je vais coller ma solution ici au cas où quelqu'un en aurait besoin. Le code suivant fonctionne peu importe si le premier jour de la semaine est un lundi ou un dimanche ou autre chose.
la source
Modulo en C # fonctionne mal pour -1mod7 (devrait être 6, c # renvoie -1) donc ... la solution "oneliner" à cela ressemblera à ceci :)
la source
Idem pour la fin de semaine (à la manière de @Compile This's answer):
la source
Vous pouvez utiliser l'excellente bibliothèque Umbrella :
Cependant, ils ne semblent avoir enregistré lundi le premier jour de la semaine (voir la propriété
nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
), de sorte que la solution localisée précédente est un peu mieux. Malheureux.Edit : en regardant de plus près la question, il semble que Umbrella pourrait également fonctionner pour cela:
Bien qu'il soit intéressant de noter que si vous demandez le lundi précédent un lundi, cela vous donnera sept jours en arrière. Mais cela est également vrai si vous utilisez
BeginningOfWeek
, ce qui semble être un bug :(.la source
Cela renverra les dates de début de semaine et de fin de semaine:
J'ai posté le code complet pour calculer le début / fin de semaine, mois, trimestre et année sur mon blog ZamirsBlog
la source
la source
Voici une combinaison de quelques-unes des réponses. Il utilise une méthode d'extension qui permet à la culture d'être transmise, si aucune n'est transmise, la culture actuelle est utilisée. Cela lui donnera une flexibilité et une réutilisation maximales.
Exemple d'utilisation:
la source
si vous voulez un samedi ou un dimanche ou n'importe quel jour de la semaine sans dépasser la semaine en cours (samedi-dimanche), je vous ai couvert avec ce morceau de code.
la source
Nous aimons les lignes simples: obtenez la différence entre le premier jour de la semaine de la culture actuelle et le jour en cours, puis soustrayez le nombre de jours du jour en cours
la source
Dans la continuité de Compile This 'Answer, utilisez la méthode suivante pour obtenir la date de n'importe quel jour de la semaine:
la source
Essayez de créer une fonction qui utilise la récursivité. Votre objet DateTime est une entrée et la fonction renvoie un nouvel objet DateTime qui représente le début de la semaine.
la source
Le calcul de cette façon vous permet de choisir quel jour de la semaine indique le début d'une nouvelle semaine (dans l'exemple que j'ai choisi lundi).
Notez que faire ce calcul pour un jour qui est un lundi donnera la lundi actuel et non le précédent.
la source