2017-02-08 3 views
0

私はこの質問に複数の答えを見つけたので、私はそれらを試しても納得がいかないので、再度議論したい。ここに私のDBだ:私はレコードを取得することができていますjavaのタイムスタンプとmongoDBのタイムスタンプを比較して値の範囲を取り出す

long startTime = 0,endTime =0; 
    Date startDateObj = new Date(); 
    Date endDateObj = new Date(); 
    MongoDatabase mongoDb = MongoDBUtil.getInstance().getDB(); 
    MongoCollection<Document> collection = mongoDb.getCollection(table); 
    String startDate = voAppDto.getStartDate(); 
    String endDate = voAppDto.getEndDate(); 
    if (startDate.length() > 0) { 
     calendarFrom.set(Calendar.YEAR, Integer.parseInt(startDate.split("-")[0])); 
     calendarFrom.set(Calendar.MONTH, Integer.parseInt(startDate.split("-")[1]) - 1); 
     calendarFrom.set(Calendar.DAY_OF_MONTH, Integer.parseInt(startDate.split("-")[2].substring(0, 2))); 
     startTime = calendarFrom.getTimeInMillis(); 
     startDateObj.setTime(startTime); 
    } 
    if (endDate.length() > 0) { 
     calendarTo.set(Calendar.YEAR, Integer.parseInt(endDate.split("-")[0])); 
     calendarTo.set(Calendar.MONTH, Integer.parseInt(endDate.split("-")[1]) - 1); 
     calendarTo.set(Calendar.DAY_OF_MONTH, Integer.parseInt(endDate.split("-")[2].substring(0, 2))); 
     endTime = calendarTo.getTimeInMillis(); 
     endDateObj.setTime(endTime); 
    } 
    MongoCursor<Document> cursor = collection.find(and(eq("Interface_Name","SDE-CONTROLLER"),eq("DataCenterId","[email protected]"),lt("TIMESTAMP",endDateObj),gt("TIMESTAMP",startDateObj))).iterator(); 

が、無:

"_id" : ObjectId("58510deae17ee5fc404a6f38"), 
    "Interface_Name" : "SDE-CONTROLLER", 
    "MsgCount" : "9798", 
    "SubsystemType" : 2, 
    "Mean" : "1224750", 
    "Dest" : "CDN", 
    "DataCenterId" : "[email protected]", 
    "SRC" : "SDE", 
    "peakMsgTimestamp" : "1481706908", 
    "PeakMsgCount" : "3087", 
    "SuccessMsgBytes" : "137172", 
    "VmId" : "vm1", 
    "TIMESTAMP" : ISODate("2016-12-14T09:16:26.459Z") 

}

私のJavaコードがあります。 mongoDBで同じクエリを実行している間にレコードの不一致が発生しました。

+0

Javaのバージョンは何ですか? – Veeram

+0

私のJavaバージョンはJava 8です –

+0

endDateとstartDateの形式は何ですか? – Veeram

答えて

0

カウントの不一致の原因は、ローカルタイムゾーンとUTC(mongodbのdatetimes)の間のオフセットのためです。

新しいJava 8の日付時刻を使用する必要があります。

以下のようにコードをリファクタリングすることができます。

import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE; 
import static java.time.format.DateTimeFormatter.ISO_LOCAL_TIME; 

String startDate = "2016-01-01 00:00:00"; 
String endDate = "2017-01-01 00:00:00"; 

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder().append(ISO_LOCAL_DATE).append(ISO_LOCAL_TIME).toFormatter(); 

Date startDateObj = Date.from(LocalDateTime.parse(startDate, dateTimeFormatter).toInstant(ZoneOffset.UTC)); 
Date endDateObj = Date.from(LocalDateTime.parse(endDate, dateTimeFormatter).toInstant(ZoneOffset.UTC)); 
関連する問題