java - month - Comment puis-je découvrir le quartier d'une date donnée?




java calendar to string (9)

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

En supposant Q1 = Jan Fév Mar, Q2 = Avril, Mai, Juin, etc.


Comme les trimestres sont un concept localisé (occidental), spécifiez une Locale 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 plus courts.


De bonnes solutions ici, mais rappelez-vous que les trimestres peuvent être sujets à changement en fonction de la société / industrie aussi. Parfois, un trimestre peut être différent de trois mois.

Vous souhaitez probablement étendre ou encapsuler la classe de calendrier pour la personnaliser à vos tâches plutôt que d'écrire une fonction d'utilitaire qui la convertit. Votre application est probablement assez complexe dans ce domaine que vous trouverez d'autres utilisations pour votre nouvelle classe de calendrier - je vous promets que vous serez heureux de l'avoir étendu ou encapsulé, même si cela semble idiot maintenant.


Vous allez devoir écrire votre propre code car le terme "trimestre" est différent pour chaque entreprise. Tu ne peux 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";

Vous pourriez utiliser

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

Soyez averti, bien que getMonth soit obsolète:

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


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

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

Assurez-vous que 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


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

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


La réponse par abdmob est correcte: Utiliser java.time est la bonne façon d'y aller.

ThreeTen-Extra

En outre, le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time.

Ses classes utiles comprennent:

Trimestre actuel

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 autour du globe par zone. Spécifiez en utilisant un nom de fuseau horaire approprié sous 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 abord converti en un type java.time. La classe Instant représente un moment sur la ligne de temps en UTC avec une résolution de nanosecondes .

Instant instant = myUtilDate.toInstant();

Attribuez un fuseau horaire pour obtenir un ZoneDateTime .

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

Générer un YearQuarter partir de ce ZonedDateTime .

YearQuarter yq = YearQuarter.from( zdt );

Utilisez dans tout votre code

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







calendar