Signatur
Beschreibung
Die Zugriffseigenschaft nanosecond liefert den Nanosekunden-Anteil (10-9 Sekunde) der Uhrzeit eines Temporal.ZonedDateTime. Der Wert ist eine ganze Zahl von 0 bis 999. Gemeint sind nur die letzten drei Stellen des Sekundenbruchteils: Bei 12:34:56.123456789 ist millisecond gleich 123, microsecond gleich 456 und nanosecond gleich 789.
Es handelt sich um eine reine Getter-Eigenschaft ohne Setter. Da Temporal-Objekte unveränderlich sind, erzeugt man einen Wert mit anderer Nanosekunde über with({ nanosecond }), round() oder durch Rechnen mit add()/subtract().
Brauchbar ist die Eigenschaft überall, wo es um Zeitstempel mit hoher Genauigkeit geht, z. B. bei Mess- und Log-Daten, beim Abgleich mit Systemen, die Nanosekunden liefern (Datenbanken, Tracing), oder um beim Formatieren zu prüfen, ob noch Stellen unterhalb der Mikrosekunde vorhanden sind.
Rückgabewert
0 bis 999: der Nanosekunden-Anteil innerhalb der aktuellen Mikrosekunde der Wanduhrzeit.Beispiele
Sekundenbruchteil in seine Teile zerlegen
const zdt = Temporal.ZonedDateTime.from(
"2021-07-01T12:34:56.123456789+02:00[Europe/Berlin]"
);
console.log(zdt.millisecond); // Millisekunden
console.log(zdt.microsecond); // Mikrosekunden
console.log(zdt.nanosecond); // Nanosekunden
Nanosekunden entfernen: with() und round()
const zdt = Temporal.ZonedDateTime.from(
"2021-07-01T12:34:56.123456789+02:00[Europe/Berlin]"
);
// Abschneiden: neues Objekt, das Original bleibt unverändert
const ohneNs = zdt.with({ nanosecond: 0 });
console.log(ohneNs.toString());
// Kaufmännisch auf Mikrosekunden runden
const gerundet = zdt.round({ smallestUnit: "microsecond" });
console.log(gerundet.microsecond, gerundet.nanosecond);
console.log(zdt.nanosecond); // Original unverändert
Zeitstempel aus Date haben nie Nanosekunden
const ausDate = Temporal.Instant
.fromEpochMilliseconds(Date.now())
.toZonedDateTimeISO("Europe/Berlin");
// Date arbeitet nur mit Millisekunden
console.log(ausDate.microsecond, ausDate.nanosecond);
// Nur mit höherer Genauigkeit gibt es Nanosekunden
const praezise = ausDate.add({ nanoseconds: 42 });
console.log(praezise.nanosecond);
Prüfen, ob eine Formatierung Stellen verliert
const hatSubMikrosekunden = (zdt) => zdt.nanosecond !== 0;
const messung = Temporal.ZonedDateTime.from(
"2024-03-10T08:00:00.000000042+01:00[Europe/Berlin]"
);
if (hatSubMikrosekunden(messung)) {
console.log("Volle Genauigkeit:", messung.toString({ fractionalSecondDigits: 9 }));
}
// Wichtig · Fallstricke
- Nur Teilwert, nicht Gesamtwert:
nanosecondliefert nur die Stellen 7–9 des Sekundenbruchteils (0–999), nicht die Nanosekunden seit Sekundenbeginn. Den ganzen Bruchteil erhält man mitmillisecond * 1e6 + microsecond * 1e3 + nanosecond, die absolute Zeit mitepochNanoseconds(einBigInt). - Vorsicht mit Modulo:
zdt.epochNanoseconds % 1000nergibt bei Zeitpunkten vor 1970 einen negativen Wert,nanoseconddagegen ist immer 0–999. - Nur lesbar: Es gibt keinen Setter. Eine Zuweisung wie
zdt.nanosecond = 5wird ohne Strict Mode stillschweigend ignoriert und löst im Strict Mode (und in Modulen) einenTypeErroraus. Stattdessenwith({ nanosecond: 5 })verwenden. - Werte außerhalb des Bereichs:
with({ nanosecond: 1000 })wird mit der Standardeinstellungoverflow: \"constrain\"auf999begrenzt. Mitoverflow: \"reject\"gibt es einenRangeError. - Kompatibilität: Temporal gibt es in Firefox 139+ und Chrome/Edge 144+, in Safari noch nicht. Für den produktiven Einsatz den Polyfill
@js-temporal/polyfillodertemporal-polyfilleinbinden.Dateundperformance.now()liefern in der Praxis keine echte Nanosekunden-Genauigkeit.