HintergrundKonvertieren von UTC in Dezimal Zeit
ich ein neues Datum/Zeit-System erstellt werden soll, basierend auf einer alte Französisch-Version mit einigen Modifikationen.
Dies beinhaltet neue Mengen UTC-Datum/Zeit Umwandlung:
- 12 Monate => 10 Monate
- 52 Wochen => 36,5 Wochen
- 28/31 Tage pro Monat => 36/37 Tage pro Monat
- 24Stunden => 20 Stunden
- 60 Minuten => 100 Minuten
- 60 Sekunden => 100 Sekunden
ich eine Uhr in JavaScript als Proof of Concept codiert haben, aber noch nicht sicher, ob ich richtig berechnet haben alles, zusätzlich, ob es der beste Ansatz ist:
-Code
1) getDecimalDate() berechnet den Tag des Jahres und berechnet dann den Monat, in dem er existiert, in einem neuen Kalender mit 36 oder 37 Tagen pro Monat. Berechnet dann das neue Datum des Monats.
function getDecimalDate(date) {
var oldDay = 1000 * 60 * 60 * 24,
startYear = new Date(Date.UTC(date.getUTCFullYear(), 0, 0)),
day = Math.floor((date - startYear)/oldDay),
num = 0,
month = 1;
if (day > 36) { num += 36; month = 2; }
if (day > 73) { num += 37; month = 3; }
if (day > 109) { num += 36; month = 4; }
if (day > 146) { num += 37; month = 5; }
if (day > 182) { num += 36; month = 6; }
if (day > 219) { num += 37; month = 7; }
if (day > 255) { num += 36; month = 8; }
if (day > 292) { num += 37; month = 9; }
if (day > 328) { num += 36; month = 10; }
return { day: day - num, month: month, year: date.getUTCFullYear(), num: num };
}
2) getDecimalTime() berechnet die Anzahl der Millisekunden seit Mitternacht, ändert es dann von den alten Millisekunden pro Tag, um neue Summen, dann Stunden berechnet, Minuten usw.
function getDecimalTime(date) {
var oldDay = 1000 * 60 * 60 * 24,
newDay = 1000 * 100 * 100 * 20,
startDay = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())),
delta = ((date - startDay)/oldDay) * newDay;
var hours = Math.floor(delta/10000000) % 20;
delta -= hours * 10000000;
var minutes = Math.floor(delta/100000) % 100;
delta -= minutes * 100000;
var seconds = Math.floor(delta/1000) % 100;
delta -= seconds * 1000;
var milliseconds = Math.floor(delta) % 1000;
return { milliseconds: milliseconds, seconds: seconds, minutes: minutes, hours: hours };
}
Sie eine Arbeits sehen hier Version: https://jsfiddle.net/kmturley/7mrwc3x3/9/
Ergebnisse
Denken Sie daran, ich habe aus Tag/Monat Namen mit lateinischen (Nov = 9, sterben = Tag, Dezember = 10, Mense = Monat)
- String - Samstag 3. Dezember => Novdie Decmense 10
- Datum - 2016.03.12 => 10-10-2016
- Time - 22.47.52 => 18:98:43
Fragen
- Ist die Mathematik korrekt?
- Gibt es Probleme mit Zeitzonen? Ich habe versucht, alle Date-Objekte in UTC konvertieren, aber JavaScript kann tricky
- Kann ich den Code verbessern? die Monatsauswahl scheint wie könnte verbessert werden, aber ich konnte nicht einen besseren Weg, 36 und 37 Tage Monate zu zählen. if (num% 36.5 === 1) würde nicht funktionieren?
Vielen Dank!
Update - 7. Dezember 2016 - neue Versionen basieren auf Lösung: https://jsfiddle.net/kmturley/7mrwc3x3/10/
https://github.com/kmturley/decimal-time
'Gibt es irgendwelche Probleme mit Zeitzonen? Ich habe versucht, alle Date-Objekte in UTC zu konvertieren, aber JavaScript kann schwierig sein. Nun, eine Zeitzone ist nicht komplizierter als ein Offset, also würde ich persönlich das UTC-Bit dieser Funktionen behalten. – Keith
Alle Datumsobjekte ** sind ** UTC. Der Zeitzonen-Offset stammt vom Host, die Nicht-UTC-Methoden verwenden diesen Offset, um "lokale" Werte zu berechnen. Wenn Sie alle UTC-Methoden verwenden, erhalten Sie UTC-Werte und der Zeitzonen-Offset wird nicht verwendet. – RobG
Guter Punkt, ich habe etwas unnötigen Code, der UTC in UTC konvertiert :) –