Ein datetime2
ist ein vollkommen akzeptabler und normaler SQL-Typ zum Speichern eines Instant
. Verwenden Sie die Instant.ToDateTimeUtc
-Methode, um eine DateTime
zu erhalten, und speichern Sie diese dann wie gewohnt in SQL. Ebenso können Sie die Methode Instant.FromDateTimeUtc
verwenden, wenn Sie den Wert aus SQL abrufen.
Alternativ könnten Sie einen SQL-Typ datetimeoffset
verwenden, wenn Sie explizit angeben möchten, dass die Werte UTC-basiert sind (der Offset ist immer Null). Es gibt ToDateTimeOffset
und FromDateTimeOffset
Methoden auf Instant
Sie verwenden können.
Sie sagte:
Noda den Fall macht, die Zeitpunkte in UTC nicht verlässlich beschrieben werden kann, da bestimmte Zeiten nie in UTC aufgetreten.
Ich denke, vielleicht sind Sie in der Formulierung in the user guide gefangen. Ich kann sehen, wie es dich in diese Richtung führen könnte. Es stimmt zwar, dass logisch ein Instant
nicht UTC darstellt, kann es durchaus sein, zuverlässig in Bezug auf UTC beschrieben. Es könnte auch in einigen anderen Begriffen beschrieben werden, solange diese Begriffe eindeutig waren.
Der Punkt, den das Benutzerhandbuch macht, ist, dass andere Werte, die nicht in UTC sind, noch in eine Instant
konvertiert werden können. Zum Beispiel könnte ich ein OffsetDateTime
oder ein DateTimeOffset
habe, die ein unterschiedlichen als Nullpunktverschiebung hat, und es könnte immer noch zurück auf Null eingestellt werden, um ein Instant
zu bilden. Ebenso könnte ich eine ZonedDateTime
haben, die der UTC-Zeitzone oder einer anderen Zeitzone zugeordnet ist, kann ich auf einen einzigen universellen Instant
ohne Verlust der Treue immer noch zurück.
Dasselbe kann nicht von DateTime
gesagt werden (es sei denn, es hat DateTimeKind.Utc
) oder von LocalDateTime
, LocalDate
, LocalTime
usw. Keiner von denen ist eindeutig ein Augenblick in der Zeit.
Was die anderen Zuordnungen:
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)
Die Antwort auf Ihre Datenbank-Engine ab, die Sie nicht angegeben. –
@DanBracuk Detail hinzugefügt, danke. MSSQL2008 – Matthew