Ich brauche die Daten nicht, um Sekunden oder Millisekunden zu enthalten.
Beachten Sie, dass sich der Gregorianische Kalender in Zyklen von 400 Jahren und damit in Zyklen von 240.000 Jahren bewegt. Daher können Sie die 60000-Millisekunden-Darstellung von Date
, die Sie nicht verwenden möchten, verwenden, um in 240000-Jahres-Zyklen (bis zu 60000 solcher Zyklen) zurückzukehren. Dies kann Sie zu ungefähr 14,4 Milliarden v. Chr. (Kurz vor Urknall :)) mit winziger Auflösung führen.
Das folgende Beispiel berücksichtigt nicht alle Funktionen des Date-Objekts. Ich glaube jedoch, dass es bei weiterer Implementierung möglich ist, ähnliche Funktionen zu haben. Zum Beispiel ist ein BigDate x
größer als ein anderes BigDate, y
wenn beide Daten AC
und x.original > y.original
oder oder x.isAC()
aber !y.isAC()
sind oder wenn beide Daten so sind BC
, dass entweder x.getFullYear() < y.getFullYear()
oder x.getFullYear() === y.getFullYear() && x.original > y.original
.
BigDate-Nutzung:
var time = new Date (
[year ],
[month ],
[day of month ],
[hours ],
[minutes ],
[a factor of 240,000,000 years to go back (from the first parameter year) ],
[a factor of 240,000 years to go back (from the first parameter year) ]);
var bigDate = new BigDate(time);
HTML
<span id="years"></span>
<span id="months"></span>
<span id="date"></span>
<span id="hours"></span>
<span id="minutes"></span>
<span id="acbc"></span>
JAVASCRIPT
function BigDate (date) { this.original = date; }
BigDate.prototype.getMinutes = function () { return this.original.getMinutes(); }
BigDate.prototype.getHours = function () { return this.original.getHours(); }
BigDate.prototype.getDate = function () { return this.original.getDate(); }
BigDate.prototype.getMonth = function () { return this.original.getMonth(); }
Und hier kommt das Fleisch:
BigDate.prototype.getFullYear = function () {
var ms = this.original.getSeconds() * 1000 + this.original.getMilliseconds();
if (ms === 0) return this.original.getFullYear();
else return (ms * 240000) - this.original.getFullYear();
}
BigDate.prototype.isAC = function () {
var result = this.original.getSeconds() === 0 &&
this.original.getMilliseconds() === 0;
return result;
}
Einige Demos (können auch zum Produzieren BigDate.prototype.toString()
usw. verwendet werden):
var years = document.getElementById("years");
var months = document.getElementById("months");
var date = document.getElementById("date");
var hours = document.getElementById("hours");
var minutes = document.getElementById("minutes");
var acbc = document.getElementById("acbc");
var time = new Date (2016, 1, 28, 8, 21, 20, 200);
var bigDate = new BigDate(time);
var monthsName = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
years.innerHTML = bigDate.getFullYear();
months.innerHTML = monthsName[bigDate.getMonth()];
date.innerHTML = bigDate.getDate();
hours.innerHTML = bigDate.getHours() + ":";
minutes.innerHTML = bigDate.getMinutes();
acbc.innerHTML = (bigDate.isAC()) ? "AC":"BC";
Der resultierende Inhalt wäre: 4847996014 Jan 28 8: 21 BC
Hier ist eine JSFiddle .
Klärung
In Bezug auf (berechtigte) Designkommentare ist mir bewusst, dass das BigDate
oben dargestellte Objekt eine schlechte Schnittstelle und ein schlechtes Design aufweist. Das Objekt wird nur als Beispiel für den Verbrauch der nicht verwendeten Informationen von Sekunden und Millisekunden dargestellt, um die Frage zu beantworten. Ich hoffe, dieses Beispiel hilft, die Technik zu verstehen.