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
相关产品推荐
相关产品推荐

