1. 程式人生 > >MongoDB 插入的時間少了8個小時

MongoDB 插入的時間少了8個小時

1、使用JDBC向MongoDB插入一條資料程式碼:

 public static void main(String[] args) {

        MongoClient mongoClient = new MongoClient("localhost", 27017);
        MongoDatabase mongoDatabase = mongoClient.getDatabase("test");
        MongoCollection<Document> collection = mongoDatabase.getCollection("foo");

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date date = simpleDateFormat.parse("2017-01-07 10:00:00");

            Document document = new Document("title", "MongoDB")
                    .append("description", "database")
                    .append("likes", 100)
                    .append("time", date);
            List<Document> documents = new ArrayList<Document>();

            documents.add(document);
            collection.insertMany(documents);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

2、從上面看到,插入的時間是  2017-01-07 10:00:00。但是 使用
db.foo.find().pretty()
看到的結果如下:
{
    "_id" : ObjectId("592fae8575b90226c0241812"),
    "title" : "MongoDB",
    "description" : "database",
    "likes" : 100,
    "time" : ISODate("2017-01-07T02:00:00Z")
}
可以看到MongoDB中的時間少了8個小時。

3、 其實Java 驅動幫我們做了轉換。

com.mongodb.util.JSONSerializers.LegacyDateSerializer程式碼:

private static class LegacyDateSerializer extends JSONSerializers.CompoundObjectSerializer {
        LegacyDateSerializer(ObjectSerializer serializer) {
            super(serializer);
        }

        public void serialize(Object obj, StringBuilder buf) {
            Date d = (Date)obj;
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
            this.serializer.serialize(new BasicDBObject("$date", format.format(d)), buf);
        }
    }
在這裡,做了時區轉換。
GregorianCalendar
中國是東八區,差了8個小時。