[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)

introduction

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! ** **

En traitement

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;
		}
	}
}

Résultat de sortie

Pour le moment, mon anniversaire et l'actualité mondiale ...

19930917 is Fri.
20170917 is Sun.
20010911 is Tue.
20110311 is Fri.
19891109 is Thu.

Impressions

・ 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

[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)
Sortie du jour en utilisant la classe Ruby's Date
[Java1.8 +] Obtenez la date du jour × suivant avec LocalDate
[Java] Obtenez le jour d'un jour spécifique
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
Afficher le calendrier et le jour japonais en utilisant la classe standard java8
[Ubuntu 20.04] Afficher le jour à la date / horloge
[Java] Je souhaite calculer la différence par rapport à la date
[Java] Obtenez la date 10 jours plus tard avec la classe Calendar
Test unitaire Java Jugement du jour spécifié Déterminez si ArDate, Date, Calendar, long est le jour spécifié.
5ème jour de Java
A été effectué dans l'année de base de la semaine calendaire Java
Qu'est-ce que la classe LocalDateTime? [Java débutant] -Date et classe d'heure-
Le calendrier Java n'est pas un singleton.
Pourquoi Java Vector n'est pas utilisé
Changez la conversation en fonction du jour d'aujourd'hui
[Java débutant] Conversion d'une chaîne de caractères en valeur numérique - Quelle est la méthode parseInt de la classe Integer? ~
[Servlet Java] La route de Senri est aussi la cinquième étape d'une étape
[Servlet Java] La route de Senri est aussi la troisième étape de la première étape
[jour: 5] J'ai résumé les bases de Java
Erreur lors de la finalisation du membre de la classe Entity utilisé dans SpringWebFlux
[Java] Comment utiliser la classe Calendar
[Servlet Java] La route de Senri est aussi la quatrième étape de la première étape
[Java] Obtenez la date avec la classe LocalDateTime
Java / Kotlin: Calculez le quotient en spécifiant le nombre de nombres valides lorsqu'il n'est pas divisible par la division (division) de BigDecimal.
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
Récupérer le premier jour de la semaine dans les paramètres régionaux actuels (quel jour est-il aujourd'hui?)
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
Officiel de Zeller (demandant le jour)
Le trait de soulignement ActiveSupport n'est pas la conversion inverse de camelize
L'ordre des modificateurs de méthode Java est fixe
Comment obtenir le jour d'aujourd'hui
Calculer le score de similarité des chaînes de caractères avec JAVA
[Ruby] Code pour afficher le jour
La date et l'heure de java8 ont été mises à jour
Première touche de la classe Files (ou Java 8)
[Java] Comment utiliser la classe Calendar et la classe Date
[Java] Comment afficher les jours acquis par LocalDate et DateTimeformatter en japonais
Être un peu bloqué le dernier jour du mois en utilisant la classe Calendar de Java
Dans Time.strptime,% j (date totale de l'année) est
Comment écrire Scala du point de vue de Java
La comparaison d'énumération est ==, et equals est bonne [Java]
Lorsque le mois de la date est acquis, le quart de janvier
Pourquoi la méthode get est nécessaire dans la classe Calendar
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
Utilisation de la classe Date
Jugement du calendrier
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java
Obtenu le jour ouvrable suivant la date spécifiée avec JAVA
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
Lorsque vous utilisez le constructeur de la classe Date de Java, la date avance de 1900.
Comment créer un formulaire pour sélectionner une date dans le calendrier
[Java] com.sun.glass.WindowEvent est importé et la fenêtre ne se ferme pas
[Rails] Lorsque le changement de disposition du dispositif n'est pas reflété
Java: dont le problème est plus rapide, en flux ou en boucle
Comment dériver le dernier jour du mois en Java
[Java] Supprimer le nombre spécifié de caractères à la fin de StringBuilder