[Java] Tag ab Datum berechnen (Kalenderklasse nicht verwenden)

Einführung

Neulich lese ich ein Buch mit dem Titel "Master of Dark Calculation", das ich in einem Antiquariat gefunden habe. Es gab eine ** Methode, um den Tag ab dem Datum ** zu berechnen. Als ich versuchte, meinen Geburtstag zu verwenden, stimmte er perfekt überein.

** Viel Spaß mit Mathematik! ** ** **

damit,

Ich habe versucht, es in das Programm aufzunehmen. Normalerweise verwende ich die Calendar-Klasse, daher ist es erfrischend, den Tag selbst zu berechnen.

** Viel Spaß beim Programmieren! ** ** **

wird bearbeitet

package math;

import java.util.HashMap;
import java.util.Map;

/**
 *Berechnung des Tages ab Datum
 * -1900er und 2000er Jahre können berechnet werden
 * -Es wird kein Jahr berücksichtigt
 */
public class CalcDayOfWeek {

	/**Code für den Monat(key:Mond/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 für Tag(key:Code/val:Berechnungsergebnisse) */
	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.");
	}

	/**Jahr(Erste 2 Ziffern)Spezifisches Gewicht bis*/
	private static final Map<Integer, Integer> WEIGHT_OF_YEAR = new HashMap<>();
	static {
		WEIGHT_OF_YEAR.put(19, 1);
		WEIGHT_OF_YEAR.put(20, 0);
	}

	/**
	 *Maine({@link #calcDayOfWeek}Ruf einfach an)
	 * @param args
	 */
	public static void main(String[] args) {
		calcDayOfWeek("1993/09/17"); //Vorerst mein Geburtstag
		calcDayOfWeek("2017/09/17"); //Der diesjährige Geburtstag

		calcDayOfWeek("2001/09/11"); //Gleichzeitige Terroranschläge in den Vereinigten Staaten
		calcDayOfWeek("2011/03/11"); //Großes Erdbeben in Ostjapan
		calcDayOfWeek("1989/11/09"); //Berliner Mauer stürzt ein
	}

	/**
	 *Tagesberechnung
	 * -Jahr: 25 letzte 2 Ziffern%Addieren Sie den Wert und die letzten beiden Ziffern.(Das spezifische Gewicht wird jedoch je nach Alter hinzugefügt.)
	 * -Monat: Wird aus der Vorzeichenzuordnung für den Monat abgerufen
	 * -Datum: Verwenden Sie es wie es ist
	 * @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;
		}
	}
}

Ausgabeergebnis

Vorerst mein Geburtstag und globale Neuigkeiten ...

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

Impressionen

・ Die Berechnung selbst ist nicht mühsam, aber es ist schwierig, sich die Vorzeichenzuordnung (SIGN_OF_MONTH) für den Monat zu merken. ・ Der Prozess wird angesichts des Jahres der Woche etwas komplizierter sein, aber er scheint nicht so groß zu sein (* Ich kann ihn aktualisieren, sobald ich ihn überprüfe). ・ Ich weiß nichts über die 1800er oder 2100er (* Ich kann es aktualisieren, sobald ich es überprüfe)

Wenn Sie es in Ihrem Kopf berechnen können, können Sie es auf einer gemeinsamen Party verwenden, nicht wahr? (geeignet)

Recommended Posts

[Java] Tag ab Datum berechnen (Kalenderklasse nicht verwenden)
Ausgabe des Tages mit der Ruby's Date-Klasse
[Java1.8 +] Mit LocalDate das Datum des nächsten × Tages abrufen
[Java] Ermittelt den Tag eines bestimmten Tages
Ab Java9 werden Klassenkonstruktoren, die primitiven Typen entsprechen, als veraltet markiert.
Zeigen Sie den japanischen Kalender und Tag mit der Java8-Standardklasse an
[Ubuntu 20.04] Zeigt den Tag auf dem Datum / der Uhr an
[Java] Ich möchte die Differenz zum Datum berechnen
[Java] Holen Sie sich das Datum 10 Tage später mit der Calendar-Klasse
Java-Unit-Test Beurteilung des angegebenen Tages Beurteilen Sie, ob ArDate, Date, Calendar, long der angegebene Tag ist.
5. Tag von Java
Wurde im Basisjahr der Java-Kalenderwoche durchgeführt
Was ist die LocalDateTime-Klasse? [Java-Anfänger] -Datum und Zeitklasse-
Java Calendar ist kein Singleton.
Warum Java Vector nicht verwendet wird
Ändern Sie das Gespräch je nachdem, welcher Tag heute ist
[Java-Anfänger] Konvertierung von Zeichenfolge in numerischen Wert - Was ist die parseInt-Methode der Integer-Klasse? ~
[Java Servlet] Die Straße von Senri ist auch der fünfte Schritt von einem Schritt
[Java Servlet] Die Straße von Senri ist auch der dritte Schritt vom ersten Schritt
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Fehler, wenn das in SpringWebFlux verwendete Mitglied der Entity-Klasse endgültig ist
[Java] Verwendung der Calendar-Klasse
[Java Servlet] Die Straße von Senri ist auch der vierte Schritt vom ersten Schritt
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Java / Kotlin: Berechnen Sie den Quotienten, indem Sie die Anzahl der gültigen Zahlen angeben, wenn er nicht durch die Division (Division) von BigDecimal teilbar ist.
Inkrementiert durch das dritte Argument der iterierten Methode der aus Java9 hinzugefügten Stream-Klasse
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
Rufen Sie den ersten Wochentag im aktuellen Gebietsschema ab (welcher Tag ist heute?)
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
Zellers Beamter (fragt nach dem Tag)
Der ActiveSupport-Unterstrich ist nicht die inverse Konvertierung von camelize
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
Wie komme ich zum heutigen Tag?
Berechnen Sie die Ähnlichkeitsbewertung von Zeichenketten mit JAVA
[Ruby] Code zur Anzeige des Tages
Das Datum und die Uhrzeit von java8 wurden aktualisiert
Erster Touch der Files-Klasse (oder Java 8)
[Java] Verwendung der Kalenderklasse und der Datumsklasse
[Java] Anzeigen der von LocalDate und DateTimeformatter erfassten Tage auf Japanisch
Mit der Kalenderklasse von Java bleibt man am letzten Tag des Monats ein wenig hängen
In Time.strptime ist% j (Gesamtdatum des Jahres)
Wie schreibe ich Scala aus der Perspektive von Java
Der Vergleich von enum ist == und gleich ist gut [Java]
Wenn der Monat des Datums erfasst wird, verschiebt sich der Januar
Warum die get-Methode in der Calendar-Klasse benötigt wird
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Verwendung der Datumsklasse
Beurteilung des Kalenders
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
Erhältlich am nächsten Werktag nach dem angegebenen Datum bei JAVA
Kommen Sie zu den Abkürzungen aus den fünf Beispielen für kursive Java-Listen
Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
[Java] com.sun.glass.WindowEvent wird importiert und das Fenster wird nicht geschlossen
[Schienen] Wenn die Layoutänderung des Geräts nicht berücksichtigt wird
Java: Das Problem ist schneller, Stream oder Loop
So leiten Sie den letzten Tag des Monats in Java ab
[Java] Löschen Sie die angegebene Anzahl von Zeichen am Ende von StringBuilder