【问题标题】:DateTimeOffset.FromUnixTimeMilliseconds vs sqlite strftimeDateTimeOffset.FromUnixTimeMilliseconds vs sqlite strftime
【发布时间】:2019-11-29 17:04:04
【问题描述】:

我的 Sqlite 数据库有一个类型为“INTEGER”的“时间”字段

我从这样的 C++ Windows 服务向它写入 Unix 时间(纪元):

insert into ServicesData (Time, ...) values (((strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000), ...);

(见https://stackoverflow.com/a/20478329/460084"获取自Unix纪元以来的秒数(%s),减去当前时间的秒数(%S),加上带小数位的秒数(%f),并将结果乘以 1000 以从秒转换为毫秒")

然后我从 .NET Core 3.1 控制台应用程序中读取日期,如下所示:

public class ServicesData {
  [Key]
  public long Time { get; set; }
  ... 
  public string ToString() {
    string res="";
    var time = DateTimeOffset.FromUnixTimeMilliseconds(Time).DateTime;
    res+= time.ToString("dd/MM/yy HH:mm:ss") + " ";
    ... return res;
  }
}


我现在从我的 .NET 应用程序中进行查询在同一个框上,并验证 ServicesData.Time 的整数值与使用 DB Browser for SQLite 的数据库上的整数值相同

但是在调用ToString() 时,结果显示的日期是一小时将条目写入数据库的时间的FW!

为什么日期不匹配?

(注意我尝试用FromUnixTimeMilliseconds(Time).UtcDateTime; 替换FromUnixTimeMilliseconds(Time).DateTime,但得到了相同的结果)

【问题讨论】:

  • 当前文化差异?
  • 可能是夏令时,但我看不出该设置是如何/在哪里设置的?或者如何解决?
  • 我会查看您正在运行代码的机器设置,以便根据日期时间设置来识别该设置
  • 所有写和读的代码都在同一台机器上,这就是我困惑的原因
  • 如果您存储了 ISO 日期,那么对于每个人(包括几天后的您)来说,都会变得容易很多。 SQLite 不喜欢 ISO 日期而不是 Unix 时间戳,它们也不更准确。事实上,Unix 时间戳是每 的,因此精度低于 ISO 字符串的毫秒数

标签: c# sqlite asp.net-core-3.0 .net-core-3.0


【解决方案1】:

我不确定为什么上面的FromUnixTimeMilliseconds 不起作用,但它可以正常工作:

var time = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
  .AddMilliseconds(Time)
  .ToLocalTime();

【讨论】:

  • 相当于FromUnixTimeMilliseconds (Time).ToLocalTime()。正是在末尾添加了ToLocalTime() 才能有所作为——但我个人对此会非常紧张。您真的想要那个时间戳的服务器本地版本吗?
  • 这并不意味着这是正确的做法。例如,您可能在那台机器上读取它,然后将其作为本地时间返回给用户——此时,本地时间毫无意义。如果稍后您移动服务器会发生什么?我建议您非常仔细考虑如何处理时区。
  • 谢谢 Jon 会做的,你还有其他关于这个问题的线索/解决方案吗?
  • 不是真的,因为你没有清楚地描述你想要达到的目标。看起来你可能正确地存储了一个 UTC 时间戳(虽然我不是 100% 确定这一点)——然后你需要考虑你想在之后做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多