我在备注文档中有一个日期字段,需要使用ssjs读取值。 如果该字段包含值,我可以使用
读取它doc.getItemValueDateTimeArray[0]
但如果日期字段为空,则代码将返回错误。
所以我的问题是 如何使用SSJS正确读取日期字段,以便在它为空时不返回错误,如果字段中有日期值则返回日期值
我希望找到一个解决方案,而不需要尝试/捕获。
由于 托马斯
答案 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)附在下面。
请记住,回收doc
或item
不会回收生成的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;
}