Entfernen Zeitzonen-Offset Aus DateTimeOffset
DateTimeOffset testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32, new TimeSpan(1, 0, 0));
//CLEAN TIME AND DATE
testDateAndTime = testDateAndTime.DateTime.Date;
var datesTableEntry = db.DatesTable.First(dt => dt.Id == someTestId);
datesTableEntry.test= testDateAndTime;
db.SaveChangesAsync();
ERGEBNIS IN DER DATENBANK: 2008-05-01 00:00:00.0000000 -04:00
Wie schalte ich -4:00
in +00:00
(aus dem code vor dem speichern)?
Habe ich versucht:
public Task<DateTimeOffset> SetTimeZoneOffsetToZero(DateTimeOffset dateTimeOffSetObj)
{
TimeSpan zeroOffsetTimeSpan = new TimeSpan(0, 0, 0, 0, 0);
return dateTimeOffSetObj.ToOffset(zeroOffsetTimeSpan);
}
Es nicht tun.
End-Ziel ist nur ein Datum ohne Zeit oder Zeitzone offset. Ich möchte NICHT konvertieren Zeit in einer anderen Zeitzone (d.h. ich möchte nicht, subtrahieren Sie 4 Stunden von der 00:00:00.0000000
Zeit, und entfernen Sie set time offset zu +00:00
ich es nur will, um den Versatz zu +00:00
). Ich möchte das aktuelle Datum mit null-offset.
Edit:
Hier wird etwas vorgeschlagen, an anderer Stelle:
DateTimeOffset testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32, new TimeSpan(1, 0, 0));
testDateAndTime = testDateAndTime.DateTime.Date; //Zero out time portion
testDateAndTime = DateTime.SpecifyKind(testDateAndTime.Date, DateTimeKind.Utc); //"Zero out" offset portion
War ich mir sicher, dass SpecifyKind
UMWANDELN würde meine dateTimeOffset, z.B. ändern Sie die Uhrzeit und die Zeitzone offset, aber auf Tests, scheint es nur ändern Sie die Zeitzone-offset, das ist, was ich will. Ist es ein problem mit es zu tun auf diese Weise?
Wenn ich date.Utc.Datum, wird es wieder ein ANDERES Datum als der, den ich habe, wenn es auf die Kante?
Guter Punkt. Vielleicht Datum.Utc.Datum?
Es gibt eine Menge von Informationen, die hier fehlen. Was die Datenbank-Plattform verwenden Sie? Was Daten-access-Technologie ist das? (EF-vielleicht?) Was ist der Datentyp des Feldes in der Datenbank? Welcher Datentyp ist die
test
Eigenschaft? Welchen code verwenden Sie, um abrufen die Daten wo sehen Sie die -04:00
offset? Wahrscheinlich der offset wird angezeigt, weil es eine Konvertierung in die lokale Zeit-zone, während der Abruf, aber Sie zeigen nicht, dass Teil. Ein MCVE.wäre hilfreich.db: SQL, field-date-Typ: datetimeoffset(7), test-prop: DateTimeOffset, "abrufen von Daten": ich bin auf der Suche auf die Daten in SQL Server manuell @DavidThielen Versuchen das jetzt.
InformationsquelleAutor VSO | 2016-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem hat nichts zu tun mit der Datenbank eigentlich. Wenn Sie einen Haltepunkt festlegen oder melden der Ausgang irgendwo, Sie sollten in der Lage sein zu sehen, der offset wird geheftet kurz nach diesem code:
Lassen Sie uns brechen diese nach unten:
DateTimeOffset
Wert von2008-05-01T08:06:32+01:00
.DateTime
, die in einer FolgeDateTime
Wert von2008-05-01T08:06:32
mitDateTimeKind.Unspecified
..Date
, die in einer FolgeDateTime
Wert von2008-05-01T00:00:00
mitDateTimeKind.Unspecified
.testDateAndTime
, die den TypDateTimeOffset
. Dies ruft einen impliziten cast vonDateTime
zuDateTimeOffset
- , die für die lokalen Zeitzone. In Ihrem Fall, es scheint der offset für diesen Wert in Ihre lokale Zeitzone-04:00
, so dass der resultierende Wert ist eineDateTimeOffset
von2008-05-01T00:00:00-04:00
, wie du Sie beschrieben hast.Sagte Sie:
Gut, es ist derzeit keine native-C# - Datentyp, der nur ein Datum ohne Uhrzeit. Es ist eine Reine
Date
geben Sie in der System.Zeit Paket in corefxlab, aber das ist nicht ganz bereit für die typische Produktion Anwendung. Es gibtLocalDate
im Noda Zeit Bibliothek, die Sie verwenden können, heute, aber Sie würden immer noch zu konvertieren zurück zu einem einheitlichen Typ vor dem speichern in der Datenbank. So in der Zwischenzeit, das beste, was Sie tun können, ist:date
geben Sie in das Feld ein.DateTime
mit einer Zeit von00:00:00
undDateTimeKind.Unspecified
. Sie werden daran denken müssen, ignorieren Sie den Teil (als es gibt in der Tat Termine, ohne eine lokale Mitternacht in bestimmte Zeitzonen).test
prop einDateTime
, nicht einDateTimeOffset
.In der Regel während der
DateTimeOffset
passt eine große Anzahl von Szenarien (wie Zeitstempel Ereignisse), es passt nicht gut für den nur-Datum-Werte.Wenn Sie wirklich möchten, dieses als ein
DateTimeOffset
Sie tun würde:Ich allerdings abraten. By doing so, Sie nehmen die lokalen Datum des ursprünglichen Wertes und behaupten, dass es in UTC. Wenn die original-offset ist nichts anderes als null, das wäre eine falsche Behauptung. Es wird zwangsläufig zu weiteren Fehlern später, als Sie reden eigentlich über einen anderen Punkt in der Zeit (möglicherweise von einem anderen Tag) als die, die Sie erstellt haben.
Hinblick auf die weitere Frage aus dem edit - Angabe
DateTimeKind.Utc
ändert sich das Verhalten der impliziten cast. Anstelle der Verwendung der lokalen Zeit-zone, es verwendet die UTC-Zeit, die hat immer ein offset von null. Das Ergebnis ist das gleiche wie die mehr explizite form, die ich oben gab. Ich noch empfehlen, gegen diese, aus den gleichen Gründen.Betrachten ein Beispiel, beginnend mit
2016-12-31T22:00:00-04:00
. Durch Ihren Ansatz, würden Sie zu speichern in die Datenbank2016-12-31T00:00:00+00:00
. Aber diese sind zwei sehr unterschiedliche Punkte in der Zeit. Die erste normiert auf UTC wäre2017-01-01T02:00:00+00:00
, und die zweite Umgerechnet auf den anderen Zeitzone wäre2016-12-30T20:00:00-04:00
. Beachten Sie die änderung der Daten in der Konvertierung. Dies ist wahrscheinlich nicht das Verhalten, das Sie wollen würde, kroch in Ihre Anwendung.InformationsquelleAutor Matt Johnson