Ich habe eine SQL-Datenbank, die ein Datumsfeld enthält.
Ich verwende Dapper, um die Datenbank wie folgt zu aktualisieren:
const string sql = "UPDATE AdminDb.Users " +
"SET IsLoggedOn = 1, LastLoggedOn = @LastLoggedOn " +
"WHERE Username = @username";
var date = DateTime.UtcNow;
DatabaseConnectionBase.DatabaseConnection.Execute(sql, new { username, LastLoggedOn = date });
Ich finde zu meinem großen Ärger beim Brechen vor dem eigentlichen Update, die Datumsvariable lautet 30/3/2015 9:32:54 aber wenn ich das Update ausführen speichert die Datenbank das Datum als 30/3/2015 10:32:54
Da das Vereinigte Königreich gestern von GMT zu BST gewechselt hat (UTC +1), bin ich mir sicher, dass die Datenbank dies zu kompensieren versucht, da dieses Problem nie zuvor auftrat.
Ich dachte, ich hätte dieses Problem vermieden, indem ich die DateTime.UtcNow-Eigenschaft zum Speichern meines Datums verwendete.
Dies verursacht schwerwiegende Probleme bei der Validierung von Benutzern.
Wie bei einem Vorschlag von einer anderen Seite habe ich versucht, das Datum wie folgt zu formatieren:
var date = DateTime.UtcNow.ToString("o");
Die Absicht war, das Datum in ISO-8601-Format zu zwingen, aber ich hatte kein Glück damit.
Hat jemand irgendwelche Ideen?
Das ist mir auch passiert. Was ich gemacht habe, war die Serialisierung der Datetime zu einer Zeichenkette, bevor ich sie als Parameter hinzufüge.
internal const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
cmd.Parameters.Add("@Threshold", DbType.DateTime).Value = threshold.ToString(DateTimeFormat);
Wenn Sie dasselbe mit reinem ADO.NET tun, passiert das Gleiche? Ich frage mich, ob dies eine Datenbank-Sache oder eine Provider-Sache ist, eher als eine Bibliothekssache. Dapper muss ToLocalTime()
oder ToUniversalTime()
- es lässt die Zeit unverändert durch. Auf SQL Server funktioniert in einer BST-Einstellung Folgendes:
public void SO29343103_UtcDates()
{
const string sql = "select @date";
var date = DateTime.UtcNow;
var returned = connection.Query<DateTime>(sql, new { date }).Single();
var delta = returned - date;
Assert.IsTrue(delta.TotalMilliseconds >= -1 && delta.TotalMilliseconds <= 1);
}