2009-02-20 6 views
2

Je dois calculer un StartDate et une EndDate d'un trimestre en cours et du trimestre précédent dans vb.net.Calculer la date de début et la date de fin pour ce trimestre et le dernier trimestre

+0

Définir "quart". – jason

+0

trimestres d'affaires, de sorte que le premier trimestre serait Janvier/Février/Mars – Slee

+0

D'accord, cela rend la résolution du problème assez simple; Je posterai une réponse ci-dessous. Le point de ma question est que chaque compagnie et chaque pays utilisent leur propre définition de «quart». – jason

Répondre

3

Pardonnez mon manque d'une réponse spécifique à VB.net, mais étant donné une sorte générique d'objet date avec diverses fonctions dans une pseudo-langue (avec le jour de base zéro et index mois) ...

//round the current month number down to a multiple of 3 
ThisQuarterStart = DateFromYearMonthDay(Today.Year,Today.Month-(Today.Month%3),0); 
//round the current month number up to a multiple of 3, then subtract 1 day 
ThisQuarterEnd = DateFromYearMonthDay((Today.Month<9)?(Today.Year):(Today.Year+1),(Today.Month-(Today.Month%3)+3)%12,0) - 1; 
//same as above, but minus 3 months 
LastQuarterStart = DateFromYearMonthDay((Today.Month<3)?(Today.Year-1):(Today.Year),(Today.Month-(Today.Month%3)+9)%12,0) 
LastQuarterEnd = ThisQuarterStart - 1; 

Modifier converti ci-dessus pseudocode à travailler VB.Net:/Stefan

Dim ThisQuarterStart As Date = New Date(Today.Year, Today.Month - (Today.Month Mod 3) + 1, 1) 
Dim ThisQuarterEnd As Date = New Date(CInt(IIf(Today.Month < 9, Today.Year, Today.Year + 1)), (Today.Month - (Today.Month Mod 3) + 3 Mod 12) + 1, 1).AddDays(-1) 
Dim LastQuarterStart As Date = New Date(CInt(IIf(Today.Month < 3, Today.Year - 1, Today.Year)), (Today.Month - (Today.Month Mod 3) + 9 Mod 12) + 1, 1) 
Dim LastQuarterEnd As Date = ThisQuarterStart.AddDays(-1) 
+0

J'aime les onelinersolutions! – Stefan

+0

Et le fait que son fonctionnement;) – Stefan

+0

doux! Je suis tellement fatigué et brûlé en ce moment que c'était une aide réelle. – Slee

12

Je sais que vous avez spécifié VB.Net, mais je suis beaucoup plus à l'aise dans l'écriture de code uncomplied C#. Je suis sûr que quelqu'un peut traduire si nécessaire.

public static DateTime QuarterEnd() { 
    DateTime now = DateTime.Now; 
    int year = now.Year; 
    DateTime[] endOfQuarters = new DateTime[] { 
     new DateTime(year, 3, 31), 
     new DateTime(year, 6, 30), 
     new DateTime(year, 9, 30), 
     new DateTime(year, 12, 31) 
    }; 
    return endOfQuarters.Where(d => d.Subtract(now).Days >= 0).First(); 
} 

Je préfère cette solution sur les autres qui impliquent l'arithmétique modulo et conditionals laids en ce qu'il est modifié assez facilement pour gérer les définitions trimestre non standard. La définition d'une méthode QuarterStart est traitée de manière similaire, et est laissée comme un exercice pour le cher lecteur. Vous pouvez également modifier cette méthode pour renvoyer un struct contenant les dates de début et de fin souhaitées.

Modifier, a ajouté VB.Net-version ci-dessus code C#/Stefan:

Public Function QuarterEnd() As Date 
    Dim endOfQuarters As Date() = New Date() { _ 
     New Date(Now.Year, 3, 31), _ 
     New Date(Now.Year, 6, 30), _ 
     New Date(Now.Year, 9, 30), _ 
     New Date(Now.Year, 12, 31)} 
    Return endOfQuarters.Where(Function(d) d.Subtract(Now).Days >= 0).First() 
End Function 
+0

+1 pour la simplicité de celui-ci. – Stefan

+0

@Stefan: Merci d'avoir ajouté la version VB.Net. – jason

+0

+1, j'aime l'implémentation. – Sparr

2

Le vb.net convertion a besoin d'un changement. L'a changé en vb 6 et devrait être lu;

ThisQuarterStart = DateSerial (today.Year, today.Month - (IIf (today.Month Mod 3 = 0, 3, today.Month Mod 3)) + 1, 1)

ThisQuarterEnd = DateSerial (CInt (IIf (aujourd'hui.Month < 9, aujourd'hui.Année, aujourd'hui.Année + 1)), ((aujourd'hui.Month - (IIf (aujourd'hui.Month Mod 3 = 0, 3, aujourd'hui.Month Mod 3)) + 3) Mod 12) + 1, 1) - 1

Questions connexes