【问题标题】:DateTime to Single with C#日期时间到单用 C#
【发布时间】:2025-12-16 18:35:01
【问题描述】:

我正在尝试在 iTunes 和 MediaMonkeys 之间建立一个接口。当我将我的曲目从 iTunes 导入到 MM 时,LastPlayed 字段未被考虑。

所以我决定构建一个从 iTunes 读取值并更新 MM 数据库的接口。

我正在使用 phxsoftware 的软件包来访问 MM 使用的 SQLite 数据库。

数据库字段是 REAL 数据类型,映射为 DbType.Single。当我进行更新时,我正在使用 Convert.ToSingle(DateTime) 将 DateTime 对象(由 IITTrack 提供)转换为 Single。

但是我收到一个错误,告诉Invalid cast from 'DateTime' to 'Single'.

对此有何提示?

【问题讨论】:

    标签: c# sqlite datetime type-conversion


    【解决方案1】:

    DateTime 有一个长类型的 Ticks 属性,因此您可以轻松地将其转换为 Single

    Convert.ToSingle(DateTime.Ticks);
    

    【讨论】:

    • 尽管他可能需要缩放和偏移它,这取决于 SQLite REAL 字段测量的单位以及基线是什么(例如 0001 年 1 月 1 日、1970 年 1 月 1 日等)。
    • 你错了。来自 SQLite 文档:# INTEGER。该值是一个有符号整数,根据值的大小存储在 1、2、3、4、6 或 8 个字节中。 # 真实的。该值是一个浮点值,存储为一个 8 字节的 IEEE 浮点数。
    【解决方案2】:
    1. SQLite 没有使用 Single(单精度 32 位),它实际上使用的是双精度(64 位)。
    2. 根据http://www.mediamonkey.com/wiki/index.php/ISDBSongData::LastPlayed,您需要执行以下操作:

      LastPlayed.Subtract(new DateTime(1899, 12, 30, 0, 0, 0, DateTimeKind.Utc)).TotalDays;

    实际上最好将该常量日期移动到某个静态只读值...

    附:评论说 SQLite 不区分整数和浮点数是错误的 - 它只有 2 种数字类型 - 8 字节浮点数和 8 字节整数。

    【讨论】:

    • 我不知道......似乎这个解决方案只是保存日期(天),而不是时间
    • 只是一个小修正:LastPlayed.Subtract(new DateTime(1899, 12, 30, 0, 0, 0, DateTimeKind.Utc))
    • 这不是真的 - 它将天数保存为浮点值,因此它实际上也包含时间。