pcp: время — сквозной naive LocalDateTime как локальное настенное время (без UTC)

Отказ от остаточной UTC-семантики: naive LocalDateTime трактуется как
локальное время единой зоны всех сервисов.

Backend (границы внешних систем):
- VisibilityPayloadParser, SyncSpacecraftFromNsiUseCase: ZoneOffset.UTC →
  ZoneId.systemDefault() для проекции внешних Instant/ISO-с-Z в naive.
- тесты границ перевёрнуты на systemDefault (под Europe/Moscow ждут +3).
- чистка UTC-формулировок в DTO-комментариях, мёртвых ссылок на
  docs/standards/DATETIME_UTC.md.

Frontend (pcp-tgu-ops-ui):
- utils/utcTime.ts → utils/localTime.ts: parseLocal/formatLocal*/toLocalIso/
  toLocalInputValue с локальной семантикой (без дописывания Z и timeZone:UTC).
- замена getUTC*/Date.UTC/toISOString-сериализации на локальные аналоги.
- убраны пользовательские подписи «UTC» в редакторе/таймлайне.
- удалён utcTime.guard.test.ts (форсил обратный UTC-инвариант); тест-фикстуры
  сделаны зоно-независимыми. tsc + vitest зелёные под TZ=UTC и TZ=Europe/Moscow.

Включает также прочие незакоммиченные правки рабочего дерева.
This commit is contained in:
Дмитрий Соловьев
2026-06-04 09:50:39 +03:00
parent 5049395911
commit 294b17757d
123 changed files with 556 additions and 535 deletions
@@ -5,7 +5,6 @@ import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import java.time.LocalDateTime
import java.time.ZoneOffset
@Entity
@Table(name = "satellite_ic")
@@ -14,7 +13,7 @@ class SatelliteIcEntity(
@Column(name = "satellite_id", nullable = false)
val satelliteId: Long = 0,
@Column(name = "orb_time", nullable = false)
val orbTime: LocalDateTime = LocalDateTime.now(ZoneOffset.UTC),
val orbTime: LocalDateTime = LocalDateTime.now(),
@Column(name = "orb_revolution", nullable = false)
val orbRevolution: Long = 0,
@Column(nullable = false)
@@ -9,7 +9,6 @@ import space.nstart.pcp.pcp_types_lib.dto.requests.slots.SlotDTO
import space.nstart.pcp.pcp_types_lib.utils.wkt.WKTParser
import space.nstart.pcp.slots_service.model.Mar
import java.time.LocalDateTime
import java.time.ZoneOffset
@Entity
@@ -27,9 +26,9 @@ class SlotEntity(
@Column(nullable = false)
val coveringType : Int = 0,
@Column(nullable = false)
var tn : LocalDateTime = LocalDateTime.now(ZoneOffset.UTC),
var tn : LocalDateTime = LocalDateTime.now(),
@Column(nullable = false)
var tk : LocalDateTime = LocalDateTime.now(ZoneOffset.UTC),
var tk : LocalDateTime = LocalDateTime.now(),
val roll : Double = 0.0,
@Column(name = "contour_wkt", columnDefinition = "TEXT", nullable = false)
val contour : String = "",
@@ -3,12 +3,11 @@ package space.nstart.pcp.slots_service.model
import org.locationtech.jts.geom.Geometry
import space.nstart.pcp.pcp_types_lib.dto.ballistics.RevolutionSign
import java.time.LocalDateTime
import java.time.ZoneOffset
class Mar (
val sat : Long = 0,
val tn : LocalDateTime = LocalDateTime.now(ZoneOffset.UTC),
val tk : LocalDateTime = LocalDateTime.now(ZoneOffset.UTC),
val tn : LocalDateTime = LocalDateTime.now(),
val tk : LocalDateTime = LocalDateTime.now(),
val roll : Double = 0.0,
val contour : String = "",
var poly : Geometry? = null,
@@ -35,7 +35,7 @@ class SlotRepositoryImpl(
coveringType = rs.getInt("covering_type"),
// getObject(LocalDateTime) читает `timestamp without time zone` без участия
// зоны JVM. getTimestamp().toLocalDateTime() зоно-нейтрален лишь для фикс-офсета;
// на зонах с DST граничные значения сдвигались бы. Времена в системе — UTC.
// на зонах с DST граничные значения сдвигались бы. Времена в системе — локальные (настенные часы, без UTC-семантики).
tn = rs.getObject("tn", java.time.LocalDateTime::class.java),
tk = rs.getObject("tk", java.time.LocalDateTime::class.java),
roll = rs.getDouble("roll"),