web-dev-qa-db-fra.com

Comment découvrir le trimestre d'une date donnée?

Étant donné un objet Java.util.Date, comment puis-je trouver le quartier dans lequel il se trouve?

En supposant que T1 = janvier févr mars, Q2 = avril, mai, juin, etc.

28
Allain Lalonde

Vous pourriez utiliser

int quarter = (myDate.getMonth() / 3) + 1;

Soyez averti, bien que getMonth soit obsolète:

À partir de la version 1.1 du JDK, remplacé par Calendar.get (Calendar.MONTH).

46
Bill the Lizard

Dans Java 8 et les versions ultérieures, les classes Java.time en ont une version plus simple. Utilisez LocalDate et IsoFields

LocalDate.now().get(IsoFields.QUARTER_OF_YEAR)
25
abdolence

Vous allez devoir écrire votre propre code car le terme "Trimestre" est différent pour chaque entreprise. Ne pouvez-vous pas faire quelque chose comme:

Calendar c = /* get from somewhere */
int month = c.get(Calendar.MONTH);

return (month >= Calendar.JANUARY && month <= Calendar.MARCH)     ? "Q1" :
       (month >= Calendar.APRIL && month <= Calendar.JUNE)        ? "Q2" :
       (month >= Calendar.JULY && month <= Calendar.SEPTEMBER)    ? "Q3" :
                                                                    "Q4";
12
Outlaw Programmer

Les quartiers étant un concept localisé (occidental), spécifiez un paramètre régional plutôt que d'utiliser la valeur par défaut de la plate-forme:

Calendar cal = Calendar.getInstance(Locale.US);
/* Consider whether you need to set the calendar's timezone. */
cal.setTime(date);
int month = cal.get(Calendar.MONTH); /* 0 through 11 */
int quarter = (month / 3) + 1;

Cela évitera d’obtenir le treizième mois (Calendar.UNDECIMBER) sur les calendriers non occidentaux et tout biais causé par leurs mois les plus courts.

10
erickson

Si tu as

private static final int[] quarters = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};

quarter est alors

private static final int thisQuarter = quarters[thisMonth];

thisMonth est

private static final int thisMonth = cal.get(Calendar.MONTH);
4
JAM

Lorsque vous utilisez l'heure Joda, utilisez la fonction Math.ceil (): 

double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
3
Coltini

Assurez-vous que la thisMonth est au moins un float ou un double, pas un int:

String quarter = thisMonth/3 <= 1 ? "Q1" : thisMonth/3 <= 2 ? "Q2" : thisMonth/3 <= 3 ? "Q3" : "Q4";

Cordialement, MS

2
Marco

JFreeChart a une classe de quart. Si vous êtes curieux, consultez le javadoc . Le source est également disponible à partir de SourceForge si vous voulez vérifier l’implémentation.

1
Brendan Cashman

tl; dr

YearQuarter
.from(
    LocalDate.of( 2018 , 1 , 23 ) 
)

Trois Dix Extra

Le Answer by abdmob est correct: Utiliser Java.time est la meilleure solution.

De plus, le projet ThreeTen-Extra / étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts à Java.time. 

Ses classes utiles incluent:

Trimestre en cours

Pour obtenir le trimestre en cours, spécifiez un fuseau horaire. Déterminer un trimestre signifie déterminer une date. Et déterminer une date signifie spécifier un fuseau horaire. Pour un moment donné, la date varie dans le monde entier par zone. Spécifiez en utilisant un nom de fuseau horaire approprié sous la forme de continent/region. N'utilisez jamais les abréviations de 3-4 lettres telles que EST ou IST.

ZoneId z = ZoneId.of( "America/Montreal" );
YearQuarter yq = YearQuarter.now( z );

Étant donné un Java.util.Date

Si un Java.util.Date est attribué, convertissez-le d'abord en un type Java.time. La classe Instant représente un moment sur la timeline dans UTC avec une résolution de nanosecondes .

Instant instant = myUtilDate.toInstant();

Attribuez un fuseau horaire pour obtenir une ZoneDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

Générez une YearQuarter à partir de cette ZonedDateTime.

YearQuarter yq = YearQuarter.from( zdt );

Utilisez tout au long de votre code

Vous devriez faire passer des instances de YearQuarter plutôt que de simples nombres ou chaînes. L'utilisation d'objets fournit une sécurité de type, garantit des valeurs valides et rend votre code plus auto-documenté.

1
Basil Bourque
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;
1
user3830848

De bonnes solutions ici, mais rappelez-vous que les trimestres peuvent également être modifiés en fonction de l'entreprise/du secteur. Parfois, un quart peut être différent de 3 mois.

Vous souhaiterez probablement étendre ou encapsuler la classe calendar pour la personnaliser en fonction de vos tâches plutôt que d'écrire une fonction utilitaire la convertissant. Votre application est probablement assez complexe dans ce domaine pour que vous puissiez trouver d'autres utilisations pour votre nouvelle classe d'agenda. Je vous promets que vous serez ravi de l'avoir étendue ou encapsulée, même si cela semble bête maintenant.

1
Bill K

avec Java8, vous pouvez utiliser le formateur:

import Java.time.format.DateTimeFormatter
import Java.time.LocalDate

println("withQuarter: " + LocalDate.of("2016".toInt,"07".toInt,1).format(DateTimeFormatter.ofPattern("yyyyQMM")))

avec Quartier: 2016 3 07

0
nexoma

Pour moi, j'ai utilisé cette méthode pour la représentation de chaîne:

int quarter = (Calendar.getInstance().get(Calendar.MONTH) / 3); // 0 to 3
String[] mQuarterKey = {"qt1", "qt2", "qt3", "qt4"};
String strQuarter = mQuarterKey[quarter];
0
Keiichi