You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下从Javascript转Python通过COM接口操作iTunes的日期问题

解决iTunes COM接口中Python日期比较的问题

嘿,我太懂这种从JS转Python处理iTunes脚本时的日期困惑了!之前用JS写的时候就踩过iTunes日期转换的坑,转到Python后发现COM接口的日期处理逻辑其实是一样的,只是Python的类型系统容易让新手摸不着头脑,咱们一步步来解决:

问题根源:iTunes返回的是OLE自动化日期

你看到的DateAdded表面上显示成02/24/18 20:52:02,用type()查看显示是"time"类型,但这其实是win32com对OLE日期的包装——底层它是一个浮点数,代表从1899年12月30日开始的天数(小数部分是一天中的时间占比)。Python的标准时间函数没法直接处理这种特殊格式,所以直接比较肯定行不通。

解决步骤:把OLE日期转成Python datetime对象

只需要写一个简单的转换函数,把iTunes返回的OLE日期转换成Python原生的datetime,之后就能正常做日期比较了。

1. 导入必要模块

import win32com.client
from datetime import datetime, timedelta

2. 编写OLE日期转datetime的函数

def ole_to_datetime(ole_date):
    # OLE自动化日期的起始基准是1899年12月30日
    ole_start = datetime(1899, 12, 30)
    # 用天数差计算实际日期
    return ole_start + timedelta(days=ole_date)

3. 实际脚本示例(检查新增歌曲)

# 连接iTunes应用
itunes = win32com.client.Dispatch("iTunes.Application")
# 获取媒体库播放列表
library_playlist = itunes.LibraryPlaylist
all_tracks = library_playlist.Tracks

# 这里假设你已经保存了上次脚本运行的时间,比如从文件读取
# 先模拟一个上次运行时间,实际使用时替换成你的存储值
last_script_run = datetime(2018, 2, 20)

# 遍历所有歌曲,筛选新增的
for track in all_tracks:
    # 获取iTunes返回的OLE日期值(底层是浮点数)
    added_ole_date = track.DateAdded
    # 转换成Python datetime
    added_datetime = ole_to_datetime(added_ole_date)
    
    # 现在可以正常比较日期了!
    if added_datetime > last_script_run:
        print(f"发现新增歌曲: {track.Name} | 添加时间: {added_datetime.strftime('%m/%d/%y %H:%M:%S')}")

额外验证小技巧

你可以打印一下track.DateAdded的原始值,比如:

print(track.DateAdded)

会输出类似43155.8695833333的浮点数,这就是OLE日期的真实形态——之前看到的字符串格式只是win32com自动做的格式化展示而已。

关于JS的相似问题

你说JS里也有棘手的日期转换问题,确实!JS里处理iTunes的OLE日期也是要做类似转换,比如:

function oleToDate(oleDate) {
    return new Date((oleDate - 25569) * 86400 * 1000);
}

本质都是处理OLE这个特殊的日期格式,所以这不是你犯了Python新手错误,是iTunes COM接口的共性问题~

内容的提问来源于stack exchange,提问作者Maximilian Montserrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:43:27