ArcGIS Java SDK中用CreationDate查询ServiceFeatureTable报错求助
基于CreationDate字段查询ServiceFeatureTable的解决方案
当然可以基于CreationDate字段查询ServiceFeatureTable!你遇到的Invalid query parameters错误,几乎可以肯定是日期格式不匹配导致的——ArcGIS Runtime SDK对日期字段的查询语法要求和你之前用REST直接请求的方式略有不同,咱们来一步步解决:
问题根源
你直接把毫秒时间戳字符串传给CreationDate的where子句,但ArcGIS的服务端期望的是符合标准格式的日期字符串(比如UTC格式的yyyy-MM-dd'T'HH:mm:ss.SSS'Z'),而不是原始的毫秒数。
解决方案1:转换为标准日期字符串
把你的毫秒时间戳转换成ArcGIS支持的日期格式,再传入where子句:
import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; // 要查询的起始时间(毫秒时间戳) long startTimeMillis = 1527671854180L; // 转换为ArcGIS服务端认可的UTC日期字符串 SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); String formattedStartDate = dateFormatter.format(new Date(startTimeMillis)); // 构建查询参数 ServiceFeatureTable featureTable = new ServiceFeatureTable(url); QueryParameters query = new QueryParameters(); // 注意日期值要放在单引号内 query.setWhereClause("CreationDate >= '" + formattedStartDate + "'"); query.setReturnGeometry(true); ListenableFuture<FeatureQueryResult> queryFeaturesAsync = featureTable.queryFeaturesAsync(query);
解决方案2:使用TimeExtent(更推荐)
ArcGIS Runtime SDK提供了TimeExtent类,专门用于时间范围查询,不需要手动拼接where子句,SDK会自动处理日期格式,更简洁可靠:
// 定义时间范围:从指定毫秒时间戳到当前时间 TimeExtent timeExtent = new TimeExtent(new Date(1527671854180L), new Date()); ServiceFeatureTable featureTable = new ServiceFeatureTable(url); QueryParameters query = new QueryParameters(); query.setTimeExtent(timeExtent); // 设置时间范围 query.setReturnGeometry(true); ListenableFuture<FeatureQueryResult> queryFeaturesAsync = featureTable.queryFeaturesAsync(query);
额外注意事项
- 先确认你的服务中
CreationDate字段的类型确实是esriFieldTypeDate(可以通过REST服务的字段详情页面查看),如果是字符串类型,那查询语法又不一样了。 - 如果你的要素服务使用的是非UTC时区,需要调整日期格式化时的时区,确保和服务端一致。
内容的提问来源于stack exchange,提问作者Naveen Kumar H S




