ArcGIS中的日期類型有別於其他數據類型,處理起來比較麻煩。本文將從存儲、顯示、查詢、Flex/java調用及轉換方面,探討日期類型的機理並對常見問題進行匯總,希望對讀者能有所幫助。
存儲
- shapefile或coverage存儲的日期格式為:yyyy-mm-dd。需要注意的是,這兩種數據類型只能存儲日期,不能存儲時間,時間部分會被截掉;如果要根據時間做時態數據的顯示和分析,請使用geodatabase。
- geodatabase(地理數據庫)存儲的日期格式為:yyyy-mm-dd hh:mm:ss AM或PM。
- 企業級數據庫因數據庫而異,可參考此處
顯示
ArcMap中日期字段隨數據源類型的不同而有所差異,其
顯示格式取決於系統而不是數據源本身。
可在Windows的系統區域設置(控制面板->區域和語言)中設置ArcMap中的日期顯示格式。ArcMap使用系統短日期格式顯示日期,使用長時間來顯示時間。

查詢
在ArcMap中新建shapefile格式的點圖層和geodatabase的點圖層(FeatureClass)各一個,以便進行測試。下面是其屬性表的截圖,每個圖層中只有兩個點,西安和北京,其中geodatabase的點圖層中存儲了時間信息。
shapefile格式的點圖層的屬性表

geodatabase中的點圖層的屬性表

ArcMap中時間字段的查詢方法為:"Date" = date '2012-01-10'
ArcGIS Server發布成服務后的查詢方法:將點圖層通過ArcGIS Server發布成Map Service服務,然后在瀏覽器輸入服務地址,進入Query操作頁面。 在Where中輸入查詢條件(輸入1=1,可得到所有內容),在Out Fields中輸入*(用於將所有的字段都顯示出來,當然也可指定字段),便可以得到查詢結果。

查詢結果為:

where處的查詢語句:
經過測試,對於shapefile格式的數據發布的點圖層,以下查詢語句都可通過:
Date = date '01-10-2012 00:00:00'
Date = date '01-10-2012"
Date = date '01/10/2012"
Date = date '1/10/2012"
Date = date '1-10-2012"
Date = date '2012-1-10"
對於geodatabase中點圖層發布的服務,以下查詢語句可通過:
Date = date '01-10-2012 10:10:10'
Date = date '2012-1-05 8:20:20 pm'
Date = date '2012-1-05 20:20:20'
大整數問題:
但是我們發現查詢結果中時間字段為一個
大整數(Format選擇了HTML),網上有
服務的查詢結果是時間格式(目前不清楚如何發布數據以便在Rest頁面中能正確顯示為時間而非大整數)。不過我們在代碼中調用時通常使用json格式,它返回的都是一個大整數。
這個大整數的含義是:自 1970 年 1 月 1 日起已經過的毫秒數(
如果晚於1970年1月1日,則為正數,否則為負數
)。下文會對大整數的處理進行探討。
Flex/Java中調用
參見《
利用ArcGIS Server REST API實現對Feature的編輯操作》和《
Java中調用ArcGIS Server REST API》兩篇文章,完成利用ArcGIS REST API獲取日期信息。完成對結果的解析后,會得到一個大整數,這里以西安為例,得到的數值是1326190210000。
flex中
Flex中可利用構造函數完成從大整數到日期類型的轉換:
var date:Date = new Date(1326190210000).
日期轉換為大整數:
第一種:var date1:Number = Date.parse("2012/01/10 18:10:10 GMT+0800");//注意時區
第二種:var date2:Number = Date.UTC(2012,0,10,10,10,10,0);//月份范圍是0-11.
利用Rest API實現新增功能時,如需構造時間字段,可將日期類型轉成大整數,完成日期的添加。
部分服務也可利用這種形式("Date" : "09\/19\/2009"),但有些不行,贊不清楚原因。
java中
大整數轉換為日期:
String str = "1326190210000";
Long lng = Long.parseLong(str);
Date date = new Date(lng);
Long lng = Long.parseLong(str);
Date date = new Date(lng);
日期轉換為大整數:
第一種:long lng2 = Date.UTC(2012-1900,0,10,10,10,10);//年數需要減去1900
第二種:Calendar calendar = Calendar.getInstance();
calendar.set(2012,0,10, 18, 10, 10);
calendar.set(Calendar.MILLISECOND, 0);//設置下毫秒為0,否則得到的結果后三位不確定
long lng1 =calendar.getTimeInMillis();
calendar.set(Calendar.MILLISECOND, 0);//設置下毫秒為0,否則得到的結果后三位不確定
long lng1 =calendar.getTimeInMillis();
第三種:Date.parse()和DateFormat類也可以。
如在IOS開發中遇到關於日期類型的問題,可參考下<<關於ArcGIS Runtime SDK for iOS中AGSLayerDefinition使用日期類型字段過濾的問題>>