2017-02-20 8 views
0

У меня есть отметки времени в базе данных MongoDB, и я хочу их распечатать в удобном для чтения формате даты. Использование Java и MongoClient У меня есть следующий код:Форматирование MongoDB Timestamp

import com.mongodb.MongoClient; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoCursor; 
import com.mongodb.client.MongoDatabase; 
import org.bson.Document; 

import java.sql.Timestamp; 

public class MongoDBTest 
{ 
    public static void main(String[] arguments) 
    { 
     MongoClient client = new MongoClient("127.0.0.1", 27017); 
     String databaseName = "my_database"; 
     MongoDatabase database = client.getDatabase(databaseName); 
     String collectionName = "my_collection"; 
     MongoCollection collection = database.getCollection(collectionName); 

     try (MongoCursor<Document> cursor = collection.find().iterator()) 
     { 
      while (cursor.hasNext()) 
      { 
       String json = cursor.next().toJson(); 
       Document document = Document.parse(json); 
       String stringTimestamp = document.get("timestamp").toString(); 
       Timestamp timestamp = new Timestamp(Long.parseLong(stringTimestamp)); 
       System.out.println("Timestamp: " + stringTimestamp + " Formatted: " + timestamp); 
      } 
     } 
    } 
} 

Отпечатанные метки время не кажется правильным, потому что они все из 1970, но не должны быть:

Timestamp: 1357466440 Formatted: 1970-01-16 18:04:26.44 
Timestamp: 1357466449 Formatted: 1970-01-16 18:04:26.449 
Timestamp: 1357466457 Formatted: 1970-01-16 18:04:26.457 
Timestamp: 1357466462 Formatted: 1970-01-16 18:04:26.462 
Timestamp: 1357466469 Formatted: 1970-01-16 18:04:26.469 
Timestamp: 1357466469 Formatted: 1970-01-16 18:04:26.469 
Timestamp: 1357466477 Formatted: 1970-01-16 18:04:26.477 
Timestamp: 1357466477 Formatted: 1970-01-16 18:04:26.477 

Как получить «реальные» отформатированные даты?

ответ

1

Похоже, что у вас есть timestamp значений в секундах. Умножьте на 1000, чтобы войти в миллисекунды.

String stringTimestamp = document.get("timestamp").toString(); 
Timestamp timestamp = new Timestamp(Long.parseLong(stringTimestamp) * 1000); 
Instant instant = timestamp.toInstant(); 

Здесь вы можете использовать DateTimeFormatter для форматирования. В зависимости от ваших потребностей вы можете также изменить в LocalDateTime

1

Per MongoDB documentation:

BSON Дата является 64-разрядное целое число, представляющее число миллисекунд с начала эпохи Unix (Jan 1, 1970). Это приводит к появлению диапазона датирования около 290 миллионов лет назад и будущего.

Используйте getTimestamp() функцию командного интерпретатора, чтобы возвращать ISODate, например, ISODate("2012-10-15T21:26:17Z"):

ObjectId.prototype.getTimestamp = function() { 
    return new Date(parseInt(this.toString().slice(0,8), 16)*1000); 
} 

Или использовать его Java API, ObjectId.getDate(). Если вы хотите использовать это для запросов, вот пример фрагмента:

// create a date of yesterday 
DateTime yesterday = new DateTime().minusDays(1); 
Long timestamp = yesterday.getMillis()/1000L; 
String oidString = Long.toHexString(l) + "0000000000000000"; 

// now find anything newer than that date 
ObjectId id = new ObjectId(oidString); 
DBObject result = new BasicDBObject("_id", new BasicDBObject("$gt", id));