A datetime2
- вполне приемлемый и нормальный тип SQL для хранения Instant
. Используйте метод Instant.ToDateTimeUtc
, чтобы получить DateTime
, а затем сохраните его в SQL как обычно. Аналогично, вы можете использовать метод Instant.FromDateTimeUtc
при извлечении значения из SQL.
В качестве альтернативы вы можете использовать тип SQL datetimeoffset
, если хотите, чтобы были явными, что значения основаны на UTC (смещение всегда будет равным нулю). Есть ToDateTimeOffset
и FromDateTimeOffset
методов на Instant
вы можете использовать.
Вы сказали:
Нода делает дело, что моменты не могут достоверно описать в UTC, так как определенные времена никогда не происходило в UTC.
Я думаю, что, возможно, вы попали в формулировку в the user guide. Я вижу, как это может привести вас к этой линии мышления. Хотя верно, что логически Instant
не представляет UTC, он, безусловно, может быть надежно описан с точки зрения UTC. Это также можно описать в некоторых других терминах, если эти термины недвусмысленны.
Точка, которую делает руководство пользователя, состоит в том, что другие значения, которые не являются в UTC, могут быть преобразованы в Instant
. Например, у меня может быть OffsetDateTime
или DateTimeOffset
, который имеет разницу, равную нулю, и он все равно может быть отрегулирован до нуля, чтобы сформировать Instant
. Аналогично, у меня может быть ZonedDateTime
, который назначается часовому поясу UTC или другому часовому поясу, я все равно могу вернуться к единому универсальному Instant
без потери точности.
То же не может быть сказано DateTime
(если он не имеет DateTimeKind.Utc
), или LocalDateTime
, LocalDate
, LocalTime
и т.д. Ни один из них не однозначно один момент времени.
Что касается других отображений:
Noda Time | .NET BCL | SQL Server
---------------|----------------------------|------------------------------------------
Instant | DateTime or DateTimeOffset | datetime2 or datetimeoffset
OffsetDateTime | DateTimeOffset | datetimeoffset
LocalDateTime | DateTime | datetime2
LocalDate | DateTime | date
LocalTime | TimeSpan | time
Duration | TimeSpan | int or bigint (Ticks, TotalSeconds, etc.)
Period | String | varchar
ZonedDateTime | DateTimeOffset + String | datetimeoffset + varchar (or a UDT)
Ответ зависит от вашего двигателя базы данных, которые вы не указали. –
@ DanBracuk Добавлена подробная информация, спасибо. MSSQL2008 – Matthew