我正在尝试从已经是UTC的Unix时间戳插入MySQL表。使用from_unixtime(timestamp)
可以解析,但它使用的时区是“当前时区”,这显然是连接的当前时区,而不是mysql服务器本身。
有没有办法可以更改连接的时区?我尝试在插入之前加入SET time_zone="+00:00";
,但这并没有改变任何东西。我在connection string options中也没有看到任何内容。
我意识到我可以做CONVERT_TZ(FROM_UNIXTIME(timestamp), @@session.time_zone, '+00:00')
之类的事情,但如果可以的话,我宁愿避免所有无意义的转换,尤其是from_unixtime
docs警告说转换可能不是无损的。
如果有任何不同,我正在使用MySQLConnector / Net 6.9.6。
答案 0 :(得分:0)
原来问题是我自己造成的。 DateTimeOffset.Date返回没有偏移的DateTime 。糟糕。
如果有人有类似的奇怪问题,这里有一些非常有用的东西,同时试图弄清楚连接器是什么:
在连接对象内部进行root操作,以查看它对时区的看法:
object driver = conn.GetType().GetField("driver", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(conn);
object tzOffset = driver.GetType().GetField("timeZoneOffset", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(driver);
使用SQL检查区域偏移:
TimeSpan? timediff = new MySqlCommand("SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP())", conn).ExecuteScalar() as TimeSpan?;
DateTime? nullable = new MySqlCommand("SELECT NOW()", conn).ExecuteScalar() as DateTime?;