{t("SHARED.DEPARTURE-SCHEDULED")}
-
{formatLocalTime(depLocal)}
+
+ {formatLocalTime(depLocal)}
+ {formatUtcOffset(depLocal) && (
+
+ {formatUtcOffset(depLocal)}
+
+ )}
+
{t("SHARED.ARRIVAL-SCHEDULED")}
-
{formatLocalTime(arrLocal)}
+
+ {formatLocalTime(arrLocal)}
+ {formatUtcOffset(arrLocal) && (
+
+ {formatUtcOffset(arrLocal)}
+
+ )}
+
{t("SHARED.PATH-TIME")}
- {humanizeFlyingTime(flight.flyingTime, "ru")}
+ {formatDuration(
+ scheduledDurationMinutes(depLocal, arrLocal),
+ "ru",
+ )}
diff --git a/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx b/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx
index cccd058f..aa03debf 100644
--- a/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx
+++ b/src/features/online-board/components/OnlineBoardDetailsPage.test.tsx
@@ -202,7 +202,7 @@ describe("OnlineBoardDetailsPage", () => {
// value is still present inside it.
const el = screen.getByTestId("flying-time");
expect(el).toBeTruthy();
- expect(el.textContent).toMatch(/10ч\s*30м/);
+ expect(el.textContent).toMatch(/10ч\.\s*30мин\./);
expect(el.className).toContain("visually-hidden");
});
diff --git a/src/shared/utils/datetime/datetime.test.ts b/src/shared/utils/datetime/datetime.test.ts
index bbcca745..07d568e1 100644
--- a/src/shared/utils/datetime/datetime.test.ts
+++ b/src/shared/utils/datetime/datetime.test.ts
@@ -19,12 +19,12 @@ describe("formatDuration", () => {
expect(formatDuration(1572)).toBe("1d 2h 12m");
});
- it("formats in Russian locale", () => {
- expect(formatDuration(150, "ru")).toBe("2ч 30м");
+ it("formats in Russian locale (Angular parity: 'Xч. Xмин.')", () => {
+ expect(formatDuration(150, "ru")).toBe("2ч. 30мин.");
});
- it("formats days in Russian locale", () => {
- expect(formatDuration(1572, "ru")).toBe("1д 2ч 12м");
+ it("formats days in Russian locale (Angular parity: 'Xд. Xч. Xмин.')", () => {
+ expect(formatDuration(1572, "ru")).toBe("1д. 2ч. 12мин.");
});
it("returns 'Unknown' for negative values", () => {
diff --git a/src/shared/utils/datetime/index.ts b/src/shared/utils/datetime/index.ts
index d251257f..f5ed3cde 100644
--- a/src/shared/utils/datetime/index.ts
+++ b/src/shared/utils/datetime/index.ts
@@ -7,9 +7,11 @@
/**
* Format a duration given in total minutes into a human-readable string.
+ * Russian units mirror Angular's DurationPipe (SHORT-DAY='д.', SHORT-HOUR='ч.',
+ * SHORT-MIN='мин.') so values read as '1ч. 30мин.' not '1ч 30м'.
*
* @example formatDuration(150) => "2h 30m"
- * @example formatDuration(150, "ru") => "2ч 30м"
+ * @example formatDuration(150, "ru") => "2ч. 30мин."
* @example formatDuration(0) => "0h 0m"
*/
export function formatDuration(
@@ -24,7 +26,7 @@ export function formatDuration(
const units =
locale === "ru"
- ? { d: "д", h: "ч", m: "м" }
+ ? { d: "д.", h: "ч.", m: "мин." }
: { d: "d", h: "h", m: "m" };
const daysPart = days > 0 ? `${days}${units.d} ` : "";