3

过去我玩过一些 SQLite,我非常喜欢它,以至于我想将它用于一个新项目。

第 1 步是创建数据库,我需要创建一个DateStamp字段,在其中放置事件发生时的时间戳。

SQLite 文档中,日期和时间数据类型定义如下:

1.2 日期和时间数据类型

SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

  • TEXT 作为 ISO8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • REAL 作为儒略日数字,根据预测的公历,自公元前 4714 年 11 月 24 日格林威治中午以来的天数。
  • INTEGER 作为 Unix 时间,自 1970-01-01 00:00:00 UTC 以来的秒数。

应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。

我宁愿不将日期保存为文本,而且由于 Windows DateTime 对象不会回到公元前 4714 年 11 月 24 日,我想我只能将 DateTime 值存储为 INTEGER。

那么,如何将 DateTime 存储为整数?我会得到我想要的基准日期TimeSpan和日期之间的日期,提取天数并存储它吗?

// is this a UTC date?
private static readonly DateTime utc1970_01_01 = new DateTime(1970, 1, 1);

public static double GetIntDate(DateTime dateTime) {
  // FYI: subtracting dates in .NET returns a time span object
  return (dateTime - nov24_4714bc).TotalSeconds;
}

那正确吗?这是其他人都在做的使用 SQLite 的事情吗?

它还说 SQLite 以 UTC 时间存储日期时间,所以我需要在此基础上再次转换。

以前肯定有人这样做过。我很高兴看到有人已经制作了处理这些输入的工具。SQLite 有一些内置函数,但我不太了解如何使用它们。

解决了:

好吧便便。

可以这么简单吗?

public static long ToFileTimeUtc(DateTime dateTime) {
  return dateTime.ToFileTimeUtc();
}

public static DateTime FromFileTimeUtc(long fileTimeUtc) {
  return DateTime.FromFileTimeUtc(fileTimeUtc);
}

注释?

我不能那样做吗?

4

2 回答 2

1

您是否可以使用 FileTime 取决于除您的应用程序之外的任何其他内容是否会访问数据。FileTime 表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数。

因此,您需要确保整数是 SQLLite 中的 8 字节整数,以便存储整个值。

只要您的应用程序是唯一处理此数据的应用程序,并且您始终使用 FileTime,那么就没有问题。如果其他人会访问这些数据,并且他们能够理解 FileTime,并且他们知道这就是它的本质,那么也没有问题。

于 2012-07-22T18:07:03.697 回答
0

好吧便便。

可以这么简单吗?

public static long ToFileTimeUtc(DateTime dateTime) {
  return dateTime.ToFileTimeUtc();
}

public static DateTime FromFileTimeUtc(long fileTimeUtc) {
  return DateTime.FromFileTimeUtc(fileTimeUtc);
}

注释?

我不能那样做吗?

于 2012-07-22T17:59:16.810 回答