Solr日期類型處理apache
solr控制檯查詢出的日期格式與實際時間少8個小時,由於咱們是東八區,推測是時區的緣由。json
形成這個問題的根源是東八區的人不習慣零時區的時間。其實,solr索引存儲的時間並無少8小時,只是在時間格式化的時候,用的是UTC時間,由於咱們是東八區,UTC是零時區時間,因此日期展現的時候,看起來是慢了8小時。服務器
誤區一:修改寫入時間ide
爲了解決這個問題,在solrJ寫入時間時,修改時間,增長8小時。這種方案至關於篡改了數據,是不可取的。源碼分析
誤區二:修改服務器時區性能
爲了解決這個問題,修改服務器的時區(或solr的時區)。集羣服務器時間配置應該保持一致,不該該爲了解決局部問題而破壞總體,因此不建議修改服務器時區。this
Solr日期類型在索引文件中存儲的是long類型orm
經過Date的getTime獲取long值,經過new Date(longValue)轉換爲時間。索引
Solr文本格式傳輸:日期爲UTC標準格式(如:1972-05-20T17:33:18.772Z)ci
json、XML格式都屬於文本格式。
SolrJ和Solr服務器都是根據本地時區來轉換UTC,同時也是根據本地時區來將UTC字符串轉換爲Date類型。
Solr的Web控制檯就是採用的文本傳輸格式,因此看見的時間是UTC格式字符串(滯後8小時)。
Solr二進制傳輸:日期爲long類型
採用二進制傳輸時,與時區無關。
long值是經過date.getTime直接獲取,
long值轉換Date時,直接new Date(longValue);
文本傳輸
優勢:保證UTC時間一致性,即使時區不一致的服務器依然能保證UTC時間的一致性
缺點:是數據報文比較大,性能很差。
適合場景:人機交互。
二進制傳輸
優勢:數據緊湊,性能好。
缺點:不考慮時區,沒法保證UTC時間一致。
場景:服務器間交互。通常企業集羣的服務器時鐘是統一配置的。
org.apache.solr.util.DateFormatUtil源碼: 文本格式日期處理相關 public static final TimeZone CANONICAL_TZ = UTC; public static final Locale CANONICAL_LOCALE = Locale.ROOT; public static final String NOW = "NOW"; ... static class ISO8601CanonicalDateFormat extends SimpleDateFormat { protected NumberFormat millisParser = NumberFormat.getIntegerInstance(CANONICAL_LOCALE); protected NumberFormat millisFormat = new DecimalFormat (".###", new DecimalFormatSymbols(CANONICAL_LOCALE)); public ISO8601CanonicalDateFormat() { super("yyyy-MM-dd'T'HH:mm:ss", CANONICAL_LOCALE); this.setTimeZone(CANONICAL_TZ); } .... } ... org.apache.solr.common.util.JavaBinCodec源碼: 二進制格式日期處理相關 if (val instanceof Date) { daos.writeByte(DATE); daos.writeLong(((Date) val).getTime()); return true; }