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! ** ** **
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;
}
}
}
Vorerst mein Geburtstag und globale Neuigkeiten ...
19930917 is Fri.
20170917 is Sun.
20010911 is Tue.
20110311 is Fri.
19891109 is Thu.
・ 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