L'autre jour, je lis un livre intitulé "Master of Dark Calculation" que j'ai trouvé dans une librairie d'occasion. Il y avait une ** méthode pour calculer le jour à partir de la date **, donc quand je l'ai essayé en utilisant mon anniversaire, elle correspondait parfaitement.
** Profitez des mathématiques! ** **
alors,
J'ai essayé de le mettre dans le programme. J'utilise généralement la classe Calendar, c'est donc rafraîchissant de calculer le jour par moi-même.
** Profitez de la programmation! ** **
package math;
import java.util.HashMap;
import java.util.Map;
/**
*Calcul du jour à partir de la date
* -Les années 1900 et 2000 peuvent être calculées
* -Aucune année n'est prise en compte
*/
public class CalcDayOfWeek {
/**Code du mois(key:Mois/val:Code) */
private static final Map<Integer, Integer> SIGN_OF_MONTH = new HashMap<>();
static {
SIGN_OF_MONTH.put( 1, 6);
SIGN_OF_MONTH.put( 2, 2);
SIGN_OF_MONTH.put( 3, 2);
SIGN_OF_MONTH.put( 4, 5);
SIGN_OF_MONTH.put( 5, 0);
SIGN_OF_MONTH.put( 6, 3);
SIGN_OF_MONTH.put( 7, 5);
SIGN_OF_MONTH.put( 8, 1);
SIGN_OF_MONTH.put( 9, 4);
SIGN_OF_MONTH.put(10, 6);
SIGN_OF_MONTH.put(11, 2);
SIGN_OF_MONTH.put(12, 4);
}
/**Code du jour(key:Code/val:Résultats des calculs) */
private static final Map<Integer, String> SIGN_OF_WEEK = new HashMap<>();
static {
SIGN_OF_WEEK.put(1, "Mon.");
SIGN_OF_WEEK.put(2, "Tue.");
SIGN_OF_WEEK.put(3, "Wed.");
SIGN_OF_WEEK.put(4, "Thu.");
SIGN_OF_WEEK.put(5, "Fri.");
SIGN_OF_WEEK.put(6, "Sat.");
SIGN_OF_WEEK.put(0, "Sun.");
}
/**Année(2 premiers chiffres)Poids spécifique à*/
private static final Map<Integer, Integer> WEIGHT_OF_YEAR = new HashMap<>();
static {
WEIGHT_OF_YEAR.put(19, 1);
WEIGHT_OF_YEAR.put(20, 0);
}
/**
*Principale({@link #calcDayOfWeek}Il suffit d'appeler)
* @param args
*/
public static void main(String[] args) {
calcDayOfWeek("1993/09/17"); //Pour le moment, mon anniversaire
calcDayOfWeek("2017/09/17"); //Anniversaire de cette année
calcDayOfWeek("2001/09/11"); //Attentats terroristes simultanés aux États-Unis
calcDayOfWeek("2011/03/11"); //Grand tremblement de terre dans l'est du Japon
calcDayOfWeek("1989/11/09"); //Effondrement du mur de Berlin
}
/**
*Calcul du jour
* -Année: 25 2 derniers chiffres%Ajoutez la valeur et les deux derniers chiffres.(Cependant, le poids spécifique est ajouté en fonction de l'âge.)
* -Mois: obtenu à partir du mappage des signes pour le mois
* -Date: utiliser tel quel
* @param yyyyMMdd
*/
public static void calcDayOfWeek(String yyyyMMdd) {
if (yyyyMMdd == null)
return;
yyyyMMdd = yyyyMMdd.replaceAll("-", "").replaceAll("/", "").replaceAll(" ", "");
if (!checkFormat(yyyyMMdd))
return;
int yy = Integer.parseInt(yyyyMMdd.substring(2, 4));
int mm = Integer.parseInt(yyyyMMdd.substring(4, 6));
int dd = Integer.parseInt(yyyyMMdd.substring(6, 8));
int weight = WEIGHT_OF_YEAR.get(Integer.parseInt(yyyyMMdd.substring(0, 2)));
int signOfYear = (yy / 4) + yy + weight;
int signOfMonth = SIGN_OF_MONTH.get(mm);
int signOfDay = dd;
System.out.println(String.format("%s is %s",yyyyMMdd, SIGN_OF_WEEK.get((signOfYear + signOfMonth + signOfDay) % 7)));
}
private static boolean checkFormat(String yyyyMMdd) {
try {
Integer.parseInt(yyyyMMdd);
return yyyyMMdd.length() == 8;
} catch (NumberFormatException e) {
return false;
}
}
}
Pour le moment, mon anniversaire et l'actualité mondiale ...
19930917 is Fri.
20170917 is Sun.
20010911 is Tue.
20110311 is Fri.
19891109 is Thu.
・ Le calcul lui-même n'est pas gênant, mais il est difficile de se souvenir du mappage des signes (SIGN_OF_MONTH) pour le mois. ・ Le processus sera un peu plus compliqué compte tenu de l'année de la semaine, mais il ne semble pas être si gros (* je peux le mettre à jour dès que je le vérifie) ・ Je ne sais pas pour les années 1800 ou 2100 (* je peux le mettre à jour dès que je le vérifie)
Si vous pouvez le calculer dans votre tête, vous pouvez l'utiliser lors d'une fête commune, non? (adapté)
Recommended Posts