MongoDB日期转换(string、ISODate、时间戳)
String字符串转ISODate
db.aj_hy_copy.find().forEach(function(doc) { doc.许可证有效期起始日期=new Date(doc.许可证有效期起始日期); db.aj_hy_copy.save(doc); })
ISODate转时间戳
db.aj_hy.find().forEach(function(doc) { doc.许可证有效期截止日期=doc.许可证有效期截止日期.valueOf(); db.aj_hy.save(doc); })
MongoDB中的日期查询的坑
在熟悉monggoDB的时候遇到了时间查询的问题代码如下:
import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.ServerAddress; /** * mongo 数据库直连测试 * @author fuhao * */ public class MongDBTest { public static void main(String[] args) throws Exception { List list = new ArrayList(); // 连接数据库 ip 端口 list.add(new ServerAddress("10.39.XXX.XXX", 27010)); MongoClient mongoClient = new MongoClient(list); //数据库名称 DB psdoc = mongoClient.getDB("qa_db_center"); //表明 DBCollection collection=psdoc.getCollection("base_user_info"); BasicDBObject queryObject = null; // 时间查询 数据库看到的时间不是真实时间 加8小时后才是正确的时间 DBObject dbObject = new BasicDBObject(); String startDate = "2018-03-29 15:59:06"; String endDate = "2018-03-29 16:30:46"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dbObject.put("$gte", sdf.parse(startDate)); dbObject.put("$lte", sdf.parse(endDate)); queryObject = new BasicDBObject(); queryObject.put("create_time",dbObject); DBCursor find = collection.find(queryObject); while (find.hasNext()) { DBObject next = find.next(); Object real_name = next.get("real_name"); Object mobile = next.get("mobile"); Object create_time = next.get("create_time"); String str = sdf.format(create_time); System.out.println(real_name +"====="+mobile +"====="+str); } System.out.println("结束"); } }
上面的代码中查询时间 按mysql 的流程应该查询到 2018-03-29 15:59:06 到2018-03-29 16:30:46 这个区间的数据,但是mongoDB不同,因为mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。
而系统时间使用的是GMT+0800时间,两者正好相差8个小时。
也就是用java 代码插入的时间类型的值都会被减8小时。这个坑挺大的不注意很容易出事。
展示一下对比数据便于理解
上面的圈是查询的条件对应数据库中的数据是2018-03-29T08:30:36.310Z 如下图,但是在java中你写2018-03-29 08:30:36这个时间肯定查不到数据
对比得出数据库中看到的时间和实际时间差8小时,但是查询出来的结果时间还是会被转换回来(不以时间为条件查询的话基本没什么问题)。
记录一下mongoDB中查询区间时间的执行语句
db.getCollection('base_user_info').find({"create_time":{"$gte":ISODate("2018-03-29 07:59:06"),"$lte":ISODate("2018-03-29 08:30:46")}});
base_user_info :表名 create_time:字段名
比较符号对应列表
$gt ——– greater than >
$gte ——— gt equal >=
$lt ——– less than
$lte ——— lt equal
$ne ———– not equal !=
$eq ——– equal =
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。