Temporal.PlainMonthDay.from()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

Die statische Methode Temporal.PlainMonthDay.from() erstellt ein neues Temporal.PlainMonthDay-Objekt aus einem anderen Temporal.PlainMonthDay-Objekt, einem Objekt mit Monat- und Tag-Eigenschaften oder einem RFC 9557-String.

Syntax

js
Temporal.PlainMonthDay.from(info)
Temporal.PlainMonthDay.from(info, options)

Parameter

info

Eines der folgenden:

  • Eine Temporal.PlainMonthDay-Instanz, die eine Kopie der Instanz erstellt.
  • Ein RFC 9557-String, der ein Datum und optional einen Kalender enthält. Wenn der Kalender nicht iso8601 ist, ist ein Jahr erforderlich.
  • Ein Objekt mit den folgenden Eigenschaften (in der Reihenfolge, in der sie abgerufen und validiert werden):
    calendar Optional

    Ein String, der der Eigenschaft calendarId entspricht. Standardwert ist "iso8601". Alle anderen Eigenschaften werden in diesem Kalendersystem interpretiert (im Gegensatz zum Temporal.PlainMonthDay()-Konstruktor, der die Werte im ISO-Kalendersystem interpretiert). Siehe Intl.supportedValuesOf() für eine Liste der üblicherweise unterstützten Kalendertypen.

    day

    Eine Ganzzahl, die der Eigenschaft day entspricht. Muss positiv sein, unabhängig von der overflow-Option.

    era und eraYear

    Ein String und eine Ganzzahl, die anstelle von year verwendet werden können. Siehe era und eraYear von PlainDate. Werden nur verwendet, wenn das Kalendersystem Epochen unterstützt. era und eraYear müssen gleichzeitig angegeben werden. Wenn month angegeben ist, muss mindestens einer von eraYear (zusammen mit era) oder year angegeben werden. Wenn alle era, eraYear und year angegeben sind, müssen sie konsistent sein.

    month

    Eine positive Ganzzahl, die anstelle von monthCode verwendet werden kann. Siehe month von PlainDate. Muss positiv sein, unabhängig von der overflow-Option. Wenn month angegeben ist und der Kalender nicht iso8601 ist, muss auch year (oder eraYear zusammen mit era als Ersatz) angegeben werden, da der gleiche month in verschiedenen Jahren zu mehreren möglichen monthCode-Werten führen kann. Mindestens einer von month oder monthCode muss angegeben werden. Wenn sowohl month als auch monthCode angegeben sind, müssen sie konsistent sein.

    monthCode

    Entspricht der Eigenschaft monthCode. Mindestens einer von month oder monthCode muss angegeben werden. Wenn sowohl month als auch monthCode angegeben sind, müssen sie konsistent sein.

    year

    Eine Ganzzahl, die zur Unterscheidung von month verwendet wird, wenn angegeben, da für einige Kalender derselbe month unterschiedliche monthCode in verschiedenen Jahren bedeuten kann. Siehe year von PlainDate. Wenn ein Jahr angegeben ist, validiert die overflow-Option den Monat-Tag im angegebenen Jahr, nicht nur in einem beliebigen Jahr. Wenn month angegeben ist, muss mindestens einer von eraYear (zusammen mit era) oder year angegeben werden. Wenn alle era, eraYear und year angegeben sind, müssen sie konsistent sein.

options Optional

Ein Objekt, das die folgende Eigenschaft enthält:

overflow Optional

Ein String, der das Verhalten angibt, wenn eine Datumskomponente außerhalb des Bereichs liegt (bei Verwendung des Objektinfos). Mögliche Werte sind:

"constrain" (Standard)

Die Datumskomponente wird auf den gültigen Bereich begrenzt.

"reject"

Ein RangeError wird ausgelöst, wenn die Datumskomponente außerhalb des Bereichs liegt.

Rückgabewert

Ein neues Temporal.PlainMonthDay-Objekt, das den Monat und Tag darstellt, die durch info im angegebenen calendar-System spezifiziert werden.

Jedes PlainMonthDay speichert intern ein ganzes ISO 8601-Datum, das im Zielkalender denselben Monats-Tag hat wie das, was angezeigt wird. Das Bezugsjahr ist sichtbar, wenn man mit toString() in einen String umwandelt, was ein ISO-Datum ausgibt. Das Bezugsjahr wird willkürlich, aber konsistent gewählt (d.h. jedes (monthCode, day)-Paar ordnet immer demselben ISO-Bezugsjahr zu). Es verwendet nicht das im Eingabe angegebenen Jahr. Stattdessen wird das Bezugsjahr durch Auffinden des neuesten Datums vor dem 31. Dezember 1972 gewählt, das denselben Monat-Tag im Zielkalender hat, oder des frühesten Datums nach dem 31. Dezember 1972, wenn kein solches Datum existiert.

Beispielsweise ist für vom Gregorianischen Kalender abgeleitete Kalender das Bezugsjahr 1972. Für den Hebräischen Kalender ist das Bezugsjahr 1972 im Gregorianischen Kalender, aber wenn der Monat Adar I (M05L) ist, was ein Schaltmonat ist, ist das Bezugsjahr 1970 (5730 im Hebräischen Kalender) stattdessen, weil das nächste Schaltjahr 1973 (5733 im Hebräischen Kalender) ist, was nach 1972 liegt.

Diese Bezugsjahr-Kanonisierung stellt sicher, dass equals() die zugrunde liegenden ISO-Daten ohne zusätzliche Berechnungen direkt vergleichen kann.

Ausnahmen

TypeError

Wird in einem der folgenden Fälle ausgelöst:

  • info ist weder ein Objekt noch ein String.
  • options ist weder ein Objekt noch undefined.
  • Die angegebenen Eigenschaften sind unzureichend, um ein Datum eindeutig zu bestimmen. Normalerweise müssen Sie ein year (oder era und eraYear), ein month und ein day oder ein monthCode und ein day angeben.
RangeError

Wird in einem der folgenden Fälle ausgelöst:

  • Die angegebenen Eigenschaften, die dieselbe Komponente spezifizieren, sind inkonsistent.
  • Die angegebenen nichtnumerischen Eigenschaften sind nicht gültig; beispielsweise, wenn monthCode niemals ein gültiger Monatscode in diesem Kalender ist.
  • Die angegebenen numerischen Eigenschaften liegen außerhalb des Bereichs, und options.overflow ist auf "reject" gesetzt.
  • Die Infos liegen nicht im darstellbaren Bereich, der ±(108 + 1) Tage oder etwa ±273,972.6 Jahre vom Unix-Epoch umfasst.

Beispiele

Erstellen eines PlainMonthDay aus einem Objekt

js
// Month code + day
const md = Temporal.PlainMonthDay.from({ monthCode: "M05", day: 2 });
console.log(md.toString()); // 05-02

// Month + day (only for ISO calendar)
const md2 = Temporal.PlainMonthDay.from({ month: 7, day: 1 });
console.log(md2.toString()); // 07-01

// Year + month + day
const md3 = Temporal.PlainMonthDay.from({ year: 2021, month: 7, day: 1 });
console.log(md3.toString()); // 07-01

// Year + month + day in a different calendar (where year is required)
const md4 = Temporal.PlainMonthDay.from({
  year: 2021,
  month: 7,
  day: 1,
  calendar: "hebrew",
});
console.log(md4.toString()); // 1972-03-16[u-ca=hebrew]

// Month code + day in a different calendar
const md5 = Temporal.PlainMonthDay.from({
  monthCode: "M05L",
  day: 1,
  calendar: "hebrew",
});
console.log(md5.toString()); // 1970-02-07[u-ca=hebrew]

Steuerung des Überlaufverhaltens

Standardmäßig werden außerhalb des Bereichs liegende Werte während der Erstellung auf den gültigen Bereich begrenzt. Ein Monat-Tag ohne explizites Bezugsjahr ist gültig, solange es ein Jahr gibt, in dem es gültig ist, auch wenn es nicht jedes Jahr vorkommt. Wenn Jahr, Monat und Tag alle angegeben sind, könnten die Regeln zur Zuordnung zu einem gültigen Monat-Tag komplex und kalenderspezifisch sein, aber hier ist das übliche Verhalten:

  • Wenn die year/month-Kombination ungültig ist, wird der month erzwungen, um einen gültigen monthCode im Jahr zu erhalten.
  • Wenn die year/monthCode-Kombination ungültig ist, wird ein anderes Jahr gewählt, um den monthCode unverändert zu lassen.
  • Der day wird im angegebenen Jahr-Monat erzwungen, um einen gültigen Monat-Tag zu erhalten.

Dies unterscheidet sich leicht von der üblichen Datumserzwingung, die das Jahr gegenüber dem Monatscode bevorzugt.

js
// Month always out of range
const md1 = Temporal.PlainMonthDay.from({ month: 13, day: 1 });
console.log(md1.toString()); // 12-01

// Month out of range for the specific year: 5732 is not a Hebrew leap year,
// so month is clamped to 12 to resolve to a valid monthCode
const md2 = Temporal.PlainMonthDay.from({
  year: 5732,
  month: 13,
  day: 1,
  calendar: "hebrew",
});
console.log(md2.toLocaleString("en-US", { calendar: "hebrew" })); // 1 Elul
const underlyingDate = Temporal.PlainDate.from(md2.toString());
console.log(underlyingDate.year, underlyingDate.month); // 5732 12

// Month code exists but not for the specific year: 5731 is not a Hebrew leap year,
// so a different year is chosen to keep the monthCode as M05L
const md3 = Temporal.PlainMonthDay.from({
  year: 5731,
  monthCode: "M05L",
  day: 1,
  calendar: "hebrew",
});
console.log(md3.toLocaleString("en-US", { calendar: "hebrew" })); // 1 Adar I
const underlyingDate2 = Temporal.PlainDate.from(md3.toString());
console.log(underlyingDate2.year, underlyingDate2.monthCode); // 5730 M05L

// Day always out of range
const md4 = Temporal.PlainMonthDay.from({ month: 2, day: 30 });
console.log(md4.toString()); // 02-29

// Day out of range for the specific year-month
const md5 = Temporal.PlainMonthDay.from({ year: 2021, month: 2, day: 29 });
console.log(md5.toString()); // 02-28

Sie können dieses Verhalten ändern, um stattdessen einen Fehler auszulösen:

js
Temporal.PlainMonthDay.from(
  { year: 2021, month: 13, day: 1 },
  { overflow: "reject" },
);
// RangeError: date value "month" not in 1..12: 13

Spezifikationen

Specification
Temporal
# sec-temporal.plainmonthday.from

Browser-Kompatibilität

Siehe auch