Détecter les mois avec 31 jours
-
05-07-2019 - |
Question
Existe-t-il une forme analogue du code suivant:
if(month == 4,6,9,11)
{
do something;
}
Ou doit-il être:
if(month == 4 || month == 6 etc...)
{
do something;
}
J'essaie d'écrire une instruction if
qui vérifie si ce mois a plus de 31 jours.
MODIFIER
Je suppose que le vrai problème, c’est que je comprenne une partie de ce que j’ai appris, mais chaque fois que j’essaie d’utiliser le site Web de Sun sur java, cela m’embrouille. Ma question est la suivante: si je reçois un mois d'utilisateur et un jour et que je le mets dans un format MM / jj et l'évalue, puis-il plus facile de vérifier si le mois et le jour sont valides et après le vérifier? étant valide je peux soit imprimer le MM / JJ dans le format que j'ai. S'il n'est pas valide, imprimez une ligne indiquant le mois ou le jour non valide.
La solution
Si vous utilisez C ou Java, vous pouvez le faire:
switch (month) {
case 4:
case 6:
case 9:
case 11:
do something;
break;
}
Dans certaines langues, vous pourriez même écrire le cas 4,6,9,11:
.
Une autre possibilité serait de créer un tableau [4,6,9,11], certains langages fonctionnels devraient permettre quelque chose comme si mois dans [4,6,9,11] fait quelque chose;
Comme Lior l’a dit, cela dépend de la langue.
EDIT: À propos, vous pouvez aussi le faire (juste pour le plaisir, un code incorrect car non lisible):
if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something;
Autres conseils
if( 0x0A50 & (1<<month) != 0 )
mec, c'est ridicule. (mois == 4 || mois == 6 || mois == 9 || mois == 11)
est parfaitement correct.
Vous ne spécifiez pas le langage, mais si vous utilisez Java, alors oui, vous devez le faire de la deuxième façon ou utiliser le commutateur:
switch(month) {
case 4:
case 6:
case 9:
case 11:
do something;
}
Vous pouvez également trouver utile et plus propre (selon la conception) de ne pas coder en dur les valeurs mais de les conserver ailleurs:
private static final Collection<Integer> MONTHS_TO_RUN_REPORT = Arrays.asList(4, 6, 9, 11);
....
if (MONTHS_TO_RUN_REPORT.contains(month)) {
do something;
}
Ce mois-ci
System.out.println("This month has " + new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH) + " days in it.");
Si instruction pour vérifier s'il y a 31 jours ce mois-ci
if (31 == new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH))
{
System.out.println("31 days on this month");
}
else
{
System.out.println("Not 31 days in this month");
}
Écrivez le nombre de jours pour tous les mois
Calendar cal = new GregorianCalendar();
for (int i = 0; i < 12; i++)
{
cal.set(2009, i, 1); //note that the month in Calendar goes from 0-11
int humanMonthNumber = i + 1;
int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("The " + humanMonthNumber + ". month has " + max + " days.");
}
sortie:
This month has 30 days in it.
Not 31 days in this month
The 1. month has 31 days.
The 2. month has 28 days.
The 3. month has 31 days.
The 4. month has 30 days.
The 5. month has 31 days.
The 6. month has 30 days.
The 7. month has 31 days.
The 8. month has 31 days.
The 9. month has 30 days.
The 10. month has 31 days.
The 11. month has 30 days.
The 12. month has 31 days.
Une traduction plutôt littérale en Java serait:
if (Arrays.binarySearch(new int[] { 4, 6, 9, 11 }, month) >= 0) {
Je ne sais pas ce qui est si spécial dans 4, 6, 9 et 11. Vous feriez probablement mieux d'utiliser une enum, avec EnumSet
ou peut-être une méthode sur l'énum. OTOH, peut-être que JodaTime fait quelque chose d’utile.
Je pense que votre code sera plus auto-documenté si vous utilisez les constantes statiques intégrées à Calendar (par exemple, Calendar.JANUARY, etc.)
Si vous le faites souvent - plus d'une fois - je vous recommanderais d'écrire une méthode nommée has31Days () ou isReportMonth () pour effectuer la vérification à un endroit.
MISE À JOUR:
L'important, ce ne sont pas les mois qui comptent 31 jours - c'est la règle commerciale qui vous dit quelque chose sur les rapports pour ces mois.
Je pourrais l'écrire comme ceci (j'espère que les mois avec 31 jours seront bons):
public class ReportEngine
{
public boolean isReportRequired(int month)
{
if ((month < Calendar.JANUARY) || (month > Calendar.DECEMBER))
throw new IllegalArgumentException("Invalid month: " + month);
// Reports are required for months with 31 days.
return ((month == Calendar.JANUARY) ||
(month == Calendar.MARCH) ||
(month == Calendar.MAY) ||
(month == Calendar.JULY) ||
(month == Calendar.AUGUST) ||
(month == Calendar.OCTOBER) ||
(month == Calendar.DECEMBER));
}
}
Si vous vérifiez si un mois compte plus de 31 jours, la manière la plus simple de l'écrire serait (en Java):
public static boolean hasMoreThan31Days(final int month) {
return false;
}
Ne faites pas de vérifications spécifiques. Essayez de convertir en une date valide - si elle lève une exception, signalez la date invalide. Après tout, vous devez également vérifier pour le jour supérieur à 28 (ou est-ce 29?) Si le mois est en février.
C # comme je ne connais pas Java:
int [] DaysInMonth = new int [] {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31}
if (DaysInMonth [month] == 31) ...
Oubliez la logique sophistiquée préconisée par de nombreuses personnes: cette méthode est beaucoup plus claire et facile à déboguer.
Toutefois, pour répondre à la question que vous avez réellement posée dans votre message:
if (false) ...
car il n'y a pas de mois avec PLUS de 31 jours!
Edit: Oui, je n'ai pas abordé l'année bissextile. Cela doit être traité séparément. La question était de savoir si le mois comptait 31 jours, ce à quoi le mien FAIT répond. J'aurais pu le faire avec un tableau de bools, mais puisque le tableau doit être là de toute façon, pourquoi ne pas mettre les longueurs?
Pour les dates que j'utilise, Joda Time est mentionné plus tôt, mais je comprends si cela ne vous concerne pas . Si vous voulez juste que ça ait l'air bien, vous pouvez d'abord définir une liste avec les valeurs qui vous intéressent et ensuite vérifier si votre mois est dans cette liste:
// This should be a field in a class
// Make it immutable
public static final List<Integer> LONGEST_MONTHS =
Collections.immutableList(Arrays.asList(4,6,9,11));
// Somewhere in your code
if(LONGEST_MONTHS.contains(month)) {
doSomething();
}
Aucune question sur les dates et Java ne serait complète sans mentionner Heure Joda .
for(int i = DateTimeConstants.JANUARY; i <= DateTimeConstants.DECEMBER; i++) {
LocalDate localDate = new LocalDate().withMonthOfYear(i);
System.out.println(" " +localDate.toString("MMMM") + " - " + localDate.dayOfMonth().getMaximumValue());
}
Janvier - 31
29 février -
31 mars -
30 avril -
31 mai -
30 juin -
Juillet - 31
31 août -
30 septembre -
31 octobre -
30 novembre -
31 décembre -
Fonction Simpe Aux (C #) qui vous donne le nombre de jours d'un mois donné:
private int GetDaysInMonth(DateTime date)
{
return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1).Day;
}
J'espère que ça aide
Pour presque tous, vous aurez besoin d'utiliser la deuxième option, mais dans la plupart des langues, vous pouvez écrire quelque chose de similaire à
.if [4,6,9,11].map{|day|==month}.inject(false){|all, elem| all|elem}
do thing
ou mieux encore
if month in [4,6,9,11]:
do thing
Peut-être que si vous utilisez C #, vous pouvez le faire:
public static class Extensions
{
public static bool IsIn(this Int32 intVal, params Int32[] vals)
{
return vals.Any(i => i == intVal)
}
}
int month = 4;
if (month.IsIn(4,6,9,11)) {
//do something
}
Dans Icon, vous pouvez faire
if month = (4|6|9|11) then ...
Vous pouvez également faire
if a < b < c then ...
Voir aussi
Suis-je le seul à proposer
month_has_31days = month % 2 == month < 8
au moins en C, impossible de vérifier java pour le moment
Une solution complète, tenant également compte des années bissextiles.
private static int getDaysInMonth(LocalDateTime localDateTime) {
int daysInMonth = 0;
int year = localDateTime.getYear();
int month = localDateTime.getMonth().getValue();
switch (month) {
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
daysInMonth = 31;
break;
case 4: case 6:
case 9:case 11:
daysInMonth = 30;
break;
case 2:
if(((year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0))) {
daysInMonth = 29;
} else {
daysInMonth = 28;
}
break;
default: System.out.println("Invalid month");
break;
}
return daysInMonth;
}
tl; dr
EnumSet.of( Month.JANUARY , Month.MARCH , Month.MAY , Month.JULY , Month.AUGUST , Month.OCTOBER , Month.DECEMBER )
.contains( Month.from( LocalDate.now() ) )
java.time
L’approche moderne utilise les classes java.time qui supplantent les anciennes classes gênantes de date et d’heure.
Le Mois
Enum définit un objet pour chaque mois de l'année.
EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
if( month.maxLength() == 31 ) {
thirtyOneDayMonths.add( month ) ;
}
}
Vérifiez si le mois en cours fait partie de cette collection de mois comptant 31 jours.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Month currentMonth = Month.from( today ) ;
if( thirtyOneDayMonths.contains( currentMonth ) ) {
…
}
Vous pouvez également interroger la date d'aujourd'hui .
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.lengthOfMonth()
À propos de java.time
Le java.time Le framework est intégré à Java 8 et supérieur. Ces classes supplantent les anciennes classes de date-heure héritées , telles que java.util.Date
, Agenda
, & amp ; SimpleDateFormat
.
Le projet Joda-Time , maintenant dans mode maintenance , conseille la migration vers le classes java.time .
Pour en savoir plus, consultez le Didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes java.time?
- Java SE 8 , Java SE 9 et versions ultérieures
- Intégré.
- Partie de l'API Java standard avec une implémentation intégrée.
- Java 9 ajoute certaines fonctionnalités et corrections mineures.
- Java SE 6 et Java SE 7
- Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 & amp; 7 Dans le TroisTen-Backport .
- Android
- Le projet ThreeTenABP s'adapte < em> ThreeTen-Backport (mentionné ci-dessus) pour Android en particulier.
- Voir Comment utiliser ThreeTenABP & # 8230; .
Le projet ThreeTen-Extra étend le java.time avec des cours supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à java.time. Vous pouvez trouver ici des classes utiles telles que Intervalle
, YearWeek
, < code> YearQuarter , et plus .
Passez au premier du mois prochain et soustrayez un jour.
Calendar cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);