2015-03-30 2 views
4

У меня есть база данных Sql, которая содержит поле даты.Utc Сохранение даты как локальная дата в Sqlite

Я использую Щеголеватый для обновления базы данных следующим образом:

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 }); 

Я найти к моему большому неудовольствию при дроблении до фактического обновления, переменная дата читает 30/3/2015 9:32:54 однако, когда я запускаю обновление базы данных сохраняет дату как 30/3/2015 10:32:54

Как вчера Великобритания изменился с GMT в BST (UTC +1), я уверен, что база данных кажется чтобы попытаться компенсировать это, поскольку этот вопрос никогда не возникал раньше.

Я думал, что я предотвратил эту проблему, используя свойство DateTime.UtcNow для сохранения моей даты.

Это вызывает серьезные проблемы при проверке пользователей.

  • Уверен, что это не мой код, поскольку дата верна в методе Dapper Execute.
  • Я не могу понять, почему Dapper попытается компенсировать, так как большинство разработчиков будут кричать на такую ​​функциональность.
  • Это приводит меня к выводу, что это должно быть что-то в Sqlite, которое вызывает эту проблему. Возможно, есть прагма, которую мне нужно бежать?

Согласно предложению с другого сайта я пытался форматировать дату следующим образом:

var date = DateTime.UtcNow.ToString("o"); 

Намерение в том, чтобы заставить дату в формате ISO-8601, но у меня не было никакой удачи с этим.

У кого-нибудь есть идеи?

+0

Где эта база данных точно? На вашей локальной машине? Или другой сервер? Вы отлаживали свой код и видели, что именно возвращает DateTime.UtcNow? –

+0

Да, я отлаживал свой код, переменная date считывает правильную дату UTC до тех пор, пока я вижу ее до тех пор, пока она не войдет в метод Dapper Execute. База данных находится на удаленном сервере –

ответ

2

Это случилось со мной. Я сделал сериализацию даты и времени для строки, прежде чем добавлять ее в качестве параметра.

internal const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; 
cmd.Parameters.Add("@Threshold", DbType.DateTime).Value = threshold.ToString(DateTimeFormat); 
+0

Это сработало - СПАСИБО! –

+1

см. Здесь: http: //stackoverflow.com/a/32320813/2241289 – user2241289

1

Если вы делаете то же самое с чистым ADO.NET, то происходит то же самое? Интересно, что это вещь базы данных или вещь поставщика, а не предмет библиотеки. Dapper должен ToLocalTime() или ToUniversalTime() звонков - он передает время без изменений. В SQL Server следующее работает в режиме BST:

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); 
    } 
12

Thomas Levesque имеет решение here:

// You just need to specify DateTimeKind=Utc in your connection string: 
string connectionString = @"Data Source=D:\tmp\testSQLiteDate.db;DateTimeKind=Utc"; 
+0

Это на самом деле правильный ответ. –

Смежные вопросы