使用SSJS从Xpages中的日期字段读取值的正确方法是什么

时间:2014-09-08 15:17:50

标签: date vector xpages xpages-ssjs

我在备注文档中有一个日期字段,需要使用ssjs读取值。 如果该字段包含值,我可以使用

读取它
doc.getItemValueDateTimeArray[0]

但如果日期字段为空,则代码将返回错误。

所以我的问题是 如何使用SSJS正确读取日期字段,以便在它为空时不返回错误,如果字段中有日期值则返回日期值

我希望找到一个解决方案,而不需要尝试/捕获。

由于 托马斯

4 个答案:

答案 0 :(得分:3)

尝试这样的事情

var item:NotesItem =doc.getFirstItem("ItemName");
if (item== null) {
    dateVar=now;
} else {
    dateVar=doc.getItemValueDateTimeArray[0];
}

答案 1 :(得分:3)

如果您知道Item只包含一个DateTime,从不包含多个值而且从不包含DateRanges,则adminfd的答案应该有效。

否则它会更复杂,正如您在OpenNTF Domino API中查看Document.getItemValueDateTimeArray()时所看到的那样。 M5的代码(尽管是Java)附在下面。

请记住,回收docitem不会回收生成的DateTime对象。如果你在一个循环中获得DateTimes,你需要使用validDominoBase.recycle(dateVar),其中validDominoBase是任何尚未被回收的Domino对象。

@Override
    public Vector<org.openntf.domino.Base<?>> getItemValueDateTimeArray(final String name) {        // cf. DateRange.java
        checkMimeOpen();
        boolean mayBeMime = true;
        Vector<org.openntf.domino.Base<?>> vGIV = null; // see below
        try {
            Vector<?> v = getDelegate().getItemValueDateTimeArray(name);
            mayBeMime = false;
            if (v == null || v.size() == 0)
                return (Vector<org.openntf.domino.Base<?>>) v;
            FactorySchema<?, ?, Session> schema = DateTime.SCHEMA;
            if (v.elementAt(0) instanceof lotus.domino.DateRange)   // at moment: never
                schema = DateRange.SCHEMA;
            else {  // Workaround for Vector of DateRange-s
                while (true) {
                    int sz = v.size(), i;
                    for (i = 0; i < sz; i++)
                        if (v.elementAt(i) != null)
                            break;
                    if (i < sz)
                        break;
                    vGIV = getDelegate().getItemValue(name);
                    if (vGIV.size() != sz * 2)
                        break;
                    for (i = 0; i < sz * 2; i++)
                        if (!(vGIV.elementAt(i) instanceof lotus.domino.DateTime))
                            break;
                    if (i < sz * 2)
                        break;
                    Vector<lotus.domino.DateRange> aux = new Vector<lotus.domino.DateRange>(sz);
                    lotus.domino.Session rawsession = toLotus(Factory.getSession());
                    for (i = 0; i < sz; i++) {
                        lotus.domino.DateTime dts = (lotus.domino.DateTime) vGIV.elementAt(2 * i);
                        lotus.domino.DateTime dte = (lotus.domino.DateTime) vGIV.elementAt(2 * i + 1);
                        lotus.domino.DateRange dr = rawsession.createDateRange(dts, dte);
                        aux.add(dr);
                    }
                    v = aux;
                    schema = DateRange.SCHEMA;
                    break;
                }
            }
            return (Vector<org.openntf.domino.Base<?>>) fromLotusAsVector(v, schema, getAncestorSession());
        } catch (NotesException e) {
            while (mayBeMime) {
                MIMEEntity entity = this.getMIMEEntity(name);
                if (entity == null)
                    break;
                Object mim = null;
                try {
                    mim = Documents.getItemValueMIME(this, name, entity);
                } finally {
                    closeMIMEEntities(false, name);
                }
                if (mim == null)
                    break;
                Vector<?> v;
                if (mim instanceof Vector)
                    v = (Vector<Object>) mim;
                else if (mim instanceof Collection)
                    v = new Vector<Object>((Collection<Object>) mim);
                else if (mim.getClass().isArray())
                    v = (Vector<Object>) Arrays.asList((Object[]) mim);
                else
                    break;
                int sz = v.size(), i;
                for (i = 0; i < sz; i++) {
                    Object o = v.elementAt(i);
                    if (o == null)
                        break;
                    if ((!(o instanceof DateTime)) && (!(o instanceof DateRange)))
                        break;
                }
                if (i < sz)
                    break;
                return (Vector<org.openntf.domino.Base<?>>) v;
            }
            DominoUtils.handleException(e);
            return null;
        } finally {
            if (vGIV != null)
                Base.s_recycle(vGIV);
        }
    }

答案 2 :(得分:3)

有点晚了,但这可能会在以后作为替代方案帮助别人。

  doc.getFirstItem("dateAdded").getDateTimeValue().getLocalTime()

答案 3 :(得分:1)

我将IBM示例更新为一个更简单的示例,该示例返回了Java Date数据类型。我很少遇到带有多个值的日期字段。

protected Date getDateValue(String fieldname, Document doc, boolean getenddate) throws NotesException{
    Vector times = doc.getItemValueDateTimeArray(fieldname);
    Object time = null;
    Date date = null;

    if(times != null){
        time = times.elementAt(0);

        if (time.getClass().getName().endsWith("DateTime")) {
            date = ((DateTime) time).toJavaDate();
        }
        else if(time.getClass().getName().endsWith("DateRange")) {
            if(getenddate == true){
                date = ((DateRange) time).getEndDateTime().toJavaDate();
            }else{
                date = ((DateRange) time).getStartDateTime().toJavaDate();
            }
        }
    }

    return date; 
}