É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.
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).
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";
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.
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];
Où thisMonth
est
private static final int thisMonth = cal.get(Calendar.MONTH);
Lorsque vous utilisez l'heure Joda, utilisez la fonction Math.ceil ():
double quarter = Math.ceil(new Double(jodaDate.getMonthOfYear()) / 3.0);
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
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.
YearQuarter
.from(
LocalDate.of( 2018 , 1 , 23 )
)
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:
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 );
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 );
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é.
int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;
int quarter = month % 3 == 0? (month / 3): ( month / 3)+1;
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.
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
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];