Source code
Revision control
Copy as Markdown
Other Tools
// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally
// Copyright (C) 2025 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-temporal.plaindatetime.from
description: >
Dates in same year or years before era starts should resolve to previous era
(Japanese calendar)
includes: [temporalHelpers.js]
features: [Temporal, Intl.Era-monthcode]
---*/
const calendar = "japanese";
const options = { overflow: "reject" };
const reiwa1BeforeStart = Temporal.PlainDateTime.from({ era: "reiwa", eraYear: 1, monthCode: "M04", day: 30, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
reiwa1BeforeStart,
2019, 4, "M04", 30, 12, 34, 0, 0, 0, 0, "Reiwa 1 resolves to Heisei 31 before era start date",
"heisei", 31);
const reiwa0 = Temporal.PlainDateTime.from({ era: "reiwa", eraYear: 0, monthCode: "M05", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
reiwa0,
2018, 5, "M05", 1, 12, 34, 0, 0, 0, 0, "Reiwa 0 resolves to Heisei 30",
"heisei", 30);
const reiwa1n = Temporal.PlainDateTime.from({ era: "reiwa", eraYear: -1, monthCode: "M05", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
reiwa1n,
2017, 5, "M05", 1, 12, 34, 0, 0, 0, 0, "Reiwa -1 resolves to Heisei 29",
"heisei", 29);
const heisei31AfterStart = Temporal.PlainDateTime.from({ era: "heisei", eraYear: 31, monthCode: "M05", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
heisei31AfterStart,
2019, 5, "M05", 1, 12, 34, 0, 0, 0, 0, "Heisei 31 resolves to Reiwa 1 after era start date",
"reiwa", 1);
const heisei1BeforeStart = Temporal.PlainDateTime.from({ era: "heisei", eraYear: 1, monthCode: "M01", day: 7, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
heisei1BeforeStart,
1989, 1, "M01", 7, 12, 34, 0, 0, 0, 0, "Heisei 1 resolves to Showa 64 before era start date",
"showa", 64);
const heisei0 = Temporal.PlainDateTime.from({ era: "heisei", eraYear: 0, monthCode: "M01", day: 8, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
heisei0,
1988, 1, "M01", 8, 12, 34, 0, 0, 0, 0, "Heisei 0 resolves to Showa 63",
"showa", 63);
const heisei1n = Temporal.PlainDateTime.from({ era: "heisei", eraYear: -1, monthCode: "M01", day: 8, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
heisei1n,
1987, 1, "M01", 8, 12, 34, 0, 0, 0, 0, "Heisei -1 resolves to Showa 62",
"showa", 62);
const showa64AfterStart = Temporal.PlainDateTime.from({ era: "showa", eraYear: 64, monthCode: "M01", day: 8, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
showa64AfterStart,
1989, 1, "M01", 8, 12, 34, 0, 0, 0, 0, "Showa 64 resolves to Heisei 1 after era start date",
"heisei", 1);
const showa1BeforeStart = Temporal.PlainDateTime.from({ era: "showa", eraYear: 1, monthCode: "M12", day: 24, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
showa1BeforeStart,
1926, 12, "M12", 24, 12, 34, 0, 0, 0, 0, "Showa 1 resolves to Taisho 15 before era start date",
"taisho", 15);
const showa0 = Temporal.PlainDateTime.from({ era: "showa", eraYear: 0, monthCode: "M12", day: 25, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
showa0,
1925, 12, "M12", 25, 12, 34, 0, 0, 0, 0, "Showa 0 resolves to Taisho 14",
"taisho", 14);
const showa1n = Temporal.PlainDateTime.from({ era: "showa", eraYear: -1, monthCode: "M12", day: 25, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
showa1n,
1924, 12, "M12", 25, 12, 34, 0, 0, 0, 0, "Showa -1 resolves to Taisho 13",
"taisho", 13);
const taisho15AfterStart = Temporal.PlainDateTime.from({ era: "taisho", eraYear: 15, monthCode: "M12", day: 25, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
taisho15AfterStart,
1926, 12, "M12", 25, 12, 34, 0, 0, 0, 0, "Taisho 15 resolves to Showa 1 after era start date",
"showa", 1);
const taisho1BeforeStart = Temporal.PlainDateTime.from({ era: "taisho", eraYear: 1, monthCode: "M07", day: 29, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
taisho1BeforeStart,
1912, 7, "M07", 29, 12, 34, 0, 0, 0, 0, "Taisho 1 resolves to Meiji 45 before era start date",
"meiji", 45);
const taisho0 = Temporal.PlainDateTime.from({ era: "taisho", eraYear: 0, monthCode: "M07", day: 30, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
taisho0,
1911, 7, "M07", 30, 12, 34, 0, 0, 0, 0, "Taisho 0 resolves to Meiji 44",
"meiji", 44);
const taisho1n = Temporal.PlainDateTime.from({ era: "taisho", eraYear: -1, monthCode: "M07", day: 30, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
taisho1n,
1910, 7, "M07", 30, 12, 34, 0, 0, 0, 0, "Taisho -1 resolves to Meiji 43",
"meiji", 43);
const meiji45AfterStart = Temporal.PlainDateTime.from({ era: "meiji", eraYear: 45, monthCode: "M07", day: 30, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
meiji45AfterStart,
1912, 7, "M07", 30, 12, 34, 0, 0, 0, 0, "Meiji 45 resolves to Taisho 1 after era start date",
"taisho", 1);
const meiji1BeforeStart = Temporal.PlainDateTime.from({ era: "meiji", eraYear: 1, monthCode: "M10", day: 22, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
meiji1BeforeStart,
1868, 10, "M10", 22, 12, 34, 0, 0, 0, 0, "Meiji 1 resolves to CE 1868 before era start date",
"ce", 1868);
const meiji0 = Temporal.PlainDateTime.from({ era: "meiji", eraYear: 0, monthCode: "M10", day: 23, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
meiji0,
1867, 10, "M10", 23, 12, 34, 0, 0, 0, 0, "Meiji 0 resolves to CE 1867",
"ce", 1867);
const meiji1n = Temporal.PlainDateTime.from({ era: "meiji", eraYear: -1, monthCode: "M10", day: 23, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
meiji1n,
1866, 10, "M10", 23, 12, 34, 0, 0, 0, 0, "Meiji -1 resolves to CE 1866",
"ce", 1866);
const ce1868AfterStart = Temporal.PlainDateTime.from({ era: "ce", eraYear: 1868, monthCode: "M10", day: 23, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
ce1868AfterStart,
1868, 10, "M10", 23, 12, 34, 0, 0, 0, 0, "CE 1868 resolves to Meiji 1 after era start date",
"meiji", 1);
const ce0 = Temporal.PlainDateTime.from({ era: "ce", eraYear: 0, monthCode: "M01", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
ce0,
0, 1, "M01", 1, 12, 34, 0, 0, 0, 0, "CE 0 resolves to BCE 1",
"bce", 1);
const ce1n = Temporal.PlainDateTime.from({ era: "ce", eraYear: -1, monthCode: "M01", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
ce1n,
-1, 1, "M01", 1, 12, 34, 0, 0, 0, 0, "CE -1 resolves to BCE 2",
"bce", 2);
const bce0 = Temporal.PlainDateTime.from({ era: "bce", eraYear: 0, monthCode: "M01", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
bce0,
1, 1, "M01", 1, 12, 34, 0, 0, 0, 0, "BCE 0 resolves to CE 1",
"ce", 1);
const bce1n = Temporal.PlainDateTime.from({ era: "bce", eraYear: -1, monthCode: "M01", day: 1, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
bce1n,
2, 1, "M01", 1, 12, 34, 0, 0, 0, 0, "BCE -1 resolves to CE 2",
"ce", 2);
// Years far after the end of an era
const heisei100 = Temporal.PlainDateTime.from({ era: "heisei", eraYear: 100, monthCode: "M12", day: 31, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
heisei100,
2088, 12, "M12", 31, 12, 34, 0, 0, 0, 0, "Heisei 100 resolves to Reiwa 70",
"reiwa", 70);
const showa100 = Temporal.PlainDateTime.from({ era: "showa", eraYear: 100, monthCode: "M12", day: 31, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
showa100,
2025, 12, "M12", 31, 12, 34, 0, 0, 0, 0, "Showa 100 resolves to Reiwa 7",
"reiwa", 7);
const taisho100 = Temporal.PlainDateTime.from({ era: "taisho", eraYear: 100, monthCode: "M12", day: 31, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
taisho100,
2011, 12, "M12", 31, 12, 34, 0, 0, 0, 0, "Taisho 100 resolves to Heisei 23",
"heisei", 23);
const meiji100 = Temporal.PlainDateTime.from({ era: "meiji", eraYear: 100, monthCode: "M12", day: 31, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
meiji100,
1967, 12, "M12", 31, 12, 34, 0, 0, 0, 0, "Meiji 100 resolves to Showa 42",
"showa", 42);
const ce2000 = Temporal.PlainDateTime.from({ era: "ce", eraYear: 2000, monthCode: "M12", day: 31, hour: 12, minute: 34, calendar }, options);
TemporalHelpers.assertPlainDateTime(
ce2000,
2000, 12, "M12", 31, 12, 34, 0, 0, 0, 0, "CE 2000 resolves to Heisei 12",
"heisei", 12);
reportCompare(0, 0);