使用ODA的isBefore和isAfter方法进行日期比较

时间:2016-12-19 12:21:05

标签: xpages

在XPage重复控件中我尝试根据基础Notes视图中的日期值计算字符串。视图的前两列分别是StartDate和EndDate。

在我的代码中(见下文),打印语句工作正常,并在控制台上打印可爱的日期。一旦达到日期比较,它就会引发一些可怕的错误。

var vReturn = "unknown";
try {
    var vNow = new java.util.Date();
    var vDateToday:org.openntf.domino.DateTime = session.createDateTime(vNow);
    print("Today=" + vDateToday);
    var vStartDate:org.openntf.domino.DateTime = row.getColumnValues()[0];
    print("vStartDate=" + vStartDate);
    var vEndDate:org.openntf.domino.DateTime = row.getColumnValues()[1];
    print("vEndDate=" + vEndDate);

    if (vDateToday.isBefore(vStartDate)) {
        vReturn = "Forthcoming";
    }
    if (vDateToday.isAfter(vStartDate) && vDateToday.isBefore(vEndDate)) {
        vReturn = "Current";
    }
    if (vDateToday.isAfter(vEndDate)) {
        vReturn = "Completed";
    }

}catch(e){
    print("Travellog: " + e.toString());
}
return vReturn;

输出到控制台的前十几行如下所示:

19/12/2016 11:25:45   HTTP JVM: Today=19/12/2016 11:25:45 GMT
19/12/2016 11:25:45   HTTP JVM: vStartDate=19/12/2016 00:00:00 GMT
19/12/2016 11:25:45   HTTP JVM: vEndDate=27/12/2016 00:00:00 GMT
19/12/2016 11:25:45   HTTP JVM: java.lang.NullPointerException
19/12/2016 11:25:45   HTTP JVM:     at org.openntf.domino.xsp.script.WrapperOpenDomino$OpenFunction.call(WrapperOpenDomino.java:400)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.types.BuiltinFunction.call(BuiltinFunction.java:75)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.types.FBSObject.call(FBSObject.java:161)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.ASTTree.ASTCall.interpret(ASTCall.java:197)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.ASTTree.ASTIf.interpret(ASTIf.java:79)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.ASTTree.ASTBlock.interpret(ASTBlock.java:100)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.ASTTree.ASTTry.interpret(ASTTry.java:109)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.ASTTree.ASTProgram.interpret(ASTProgram.java:119)
19/12/2016 11:25:45   HTTP JVM:     at com.ibm.jscript.ASTTree.ASTProgram.interpretEx(ASTProgram.java:139)
...

我尝试在session.CreateDateTime中包装getColumnValues,如下所示:

var vStartDate:org.openntf.domino.DateTime = session.createDateTime(row.getColumnValues()[0])

但也会引发错误。

有人能指出我正确的方向吗?我试过了我能想到的每一个变化!

P.S。 OpenNTF Domino示例数据库中的示例看起来很简单,但它们只使用当前系统日期,而不是文档或视图条目的日期。

2 个答案:

答案 0 :(得分:1)

听起来你的专栏没有显示日期。该演示数据库中的以下按钮代码可以为我成功运行:

<xp:button value="Run SSJS Tests" id="button4"
                    xp:key="SSJSButton">
                    <xp:eventHandler event="onclick" submit="true"
                        refreshMode="partial" refreshId="SSJSDiv">
                        <xp:this.action><![CDATA[#{javascript:try {
var now = new java.util.Date();
var vw:NotesView = database.getView("AllContacts");
var ec:NotesViewEntryCollection = vw.getAllEntries();
var ent1 = ec.getFirstEntry();
var ent2 = ec.getNextEntry();
print(ent1.getColumnValues());
print(ent1.getColumnValues().get(6).getClass().getName());
var date1:org.openntf.domino.DateTime = ent1.getColumnValues().get(6);
var date2:org.openntf.domino.DateTime = ent2.getColumnValues().get(6);
date1.adjustDay(1);
retVal = "Running SSJS date1.isAfter(date2)<br/>";
if (date1.isAfter(date2)) {
    retVal += @Text(date1) + " is after " + @Text(date2) + "<br/>";
} else {
    retVal += @Text(date1) + " is NOT after " + @Text(date2) + "<br/>";
}
retVal += "<br/><br/>Running SSJS date2.isAfter(date1)<br/>";
if (date2.isAfter(date1)) {
    retVal += @Text(date2) + " is after " + @Text(date1) + "<br/>";
} else {
    retVal += @Text(date2) + " is NOT after " + @Text(date1) + "<br/>";
}
viewScope.put("SSJSTest",retVal);
} catch (e) {
    @ErrorMessage(e.toString());
}}]]></xp:this.action>
                        </xp:eventHandler>
                    </xp:button>

可能更好的选择是使用row.setPreferJavaDates()。然后确保输出Java日期(java.util.Date)而不是NotesDateTime。这也消除了回收的需要。 isBefore()isAfter()方法只需将NotesDateTime转换为java.util.Date,并使用该类中可用的内置isBefore()isAfter()方法反正。

答案 1 :(得分:0)

保罗的评论指出,NotesViewEntryNotesXspViewEntry之间存在差异,指向正确的方向。我的代码处于重复控制中,结果是重复控件返回NotesXspViewEntries。我试图获取底层的NotesViewEntry,但在阅读Tim Tripconey关于这样做的危险的评论之后(参见How do I get the parent NotesViewEntry from the NotesXSPViewEntry?)我决定转而使用基础文档。这是我的代码:

var vReturn = "unknown";
try {
    var vNow = new java.util.Date();
    var vDateToday:org.openntf.domino.DateTime = session.createDateTime(vNow);
    var vDoc:NotesDocument = row.getDocument();
    var vStartDate:org.openntf.domino.DateTime = vDoc.getItemValueDateTimeArray("DateStart").get(0);
    var vEndDate:org.openntf.domino.DateTime = vDoc.getItemValueDateTimeArray("DateEnd").get(0);

    if (vDateToday.isBeforeIgnoreTime(vStartDate)) {
        vReturn = "Forthcoming";
    }
    if ((vDateToday.equalsIgnoreTime(vStartDate) || vDateToday.isAfterIgnoreTime(vStartDate))
         && (vDateToday.equalsIgnoreTime(vEndDate) || vDateToday.isBefore(vEndDate))) {
        vReturn = "Currently Away";
    }
    if (vDateToday.isAfterIgnoreTime(vEndDate)) {
        vReturn = "Completed";
    }

}catch(e){
    print("Travellog: error in itinerary status link on home page: " + e.toString());
}
return vReturn;

我可能需要让它更健壮 - 例如如果其中一个日期字段不包含值(因为没有值的日期字段返回一个空字符串,导致.getItemValueDateTimeArray抛出错误)。

谢谢你的帮助保罗。再一次,你把我拉出编码无底坑!