如何在IBM Notes中正确收集DateTime对象到数组?值引用问题求解
解决IBM Notes中DateTime数组的引用问题
嘿,这真的不是什么新手专属问题——我见过不少资深Notes开发者都踩过这个引用类型的坑!
问题的核心在于:IBM Notes里的DateTime是引用类型,而不是值类型。你之前的代码应该是一直在修改同一个DateTime对象,然后把这个对象的引用重复添加到数组里。最后当循环结束时,这个唯一的DateTime对象被改成了最后一天的日期,所以数组里所有元素(其实都是指向同一个对象的引用)看起来全是最后那个日期。
简洁的解决方法:每次循环创建新的DateTime实例
你只需要在每次循环时,复制当前日期的独立副本,再把这个副本加入数组,而不是直接添加原对象的引用。用Duplicate()方法就能轻松做到这一点,看下面的示例代码:
Dim startDate As New NotesDateTime("02/22/2018") Dim endDate As New NotesDateTime("02/25/2018") Dim dateArray As Variant Redim dateArray(0) Dim tempDate As NotesDateTime Do While startDate.TimeDifference(endDate) <= 0 ' 关键步骤:创建当前日期的独立副本 Set tempDate = startDate.Duplicate() ' 将副本加入数组 dateArray(Ubound(dateArray)) = tempDate Redim Preserve dateArray(Ubound(dateArray)+1) ' 修改原日期对象,用于下一次循环 Call startDate.AdjustDay(1) Loop ' 移除数组末尾的空元素(可选,根据你的需求调整) If Ubound(dateArray) > 0 Then Redim Preserve dateArray(Ubound(dateArray)-1) End If
原理说明
Duplicate()方法会生成一个全新的DateTime对象,它的初始值和原对象完全一致,但两者是独立的引用——后续修改原startDate对象,不会影响已经存入数组的tempDate副本。这样数组里的每个元素都是不同的DateTime实例,各自保存着循环过程中对应的日期。
你也可以用New NotesDateTime(startDate.LSLocalTime)来创建新实例,效果和Duplicate()是一样的,选你觉得顺手的方式就行。
内容的提问来源于stack exchange,提问作者Uwe J.
相关产品推荐
相关产品推荐

