mongo-日期类型/日期查询/时间查询/UTC + 8h = 北京时间new Date/ISODate

mongo-日期类型(2)

时间格式2020-01-13T16:00:00.000Z中的T和Z

T表示分隔符Z表示的是UTC

UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。

举例

  • 北京时间:2020-01-14 00:00:00对应的国际标准时间格式为:2020-01-13T16:00:00.000Z

1、当通过mongo shell来插入日期类型数据时,使用new Date()和使用Date()是不一样的:

2、我们看:使用new Date(),插入的是一个isodate类型;而使用Date()插入的是一个字符串类型。

那isodate是什么日期类型的?我们看这2个值,它比字符串大概少了8小时。
这是由于mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。
而我当前所处的是+8区,所以mongo shell会将当前的GMT+0800时间减去8,存储成GMT时间。

3、如果通过get函数来获取,那么mongo会自动转换成当前时区的时间:

demo一:

db.createCollection("test_date")
db.test_date.insert({mark:1, mark_time:ISODate("2021-03-12T01:11:57.943Z")})
db.test_date.insert({mark:2, mark_time:ISODate("2021-03-12T02:11:57.943Z")})
db.test_date.insert({mark:3, mark_time:ISODate("2021-03-12T03:11:57.943Z")})
db.test_date.insert({mark:4, mark_time:ISODate("2021-03-12T04:11:57.943Z")})
db.test_date.insert({mark:5, mark_time:ISODate("2021-03-12T05:11:57.943Z")})
db.test_date.insert({mark:6, mark_time:ISODate("2021-03-12T06:11:57.943Z")})


db.test_date.find({mark_time:{$lt: new Date('2021-03-12 12:11:57')}})
# 数据库存储的格式为ISODate,此时等价于
db.test_date.find({mark_time:{$lt: ISODate('2021-03-12T04:11:57.943Z')}})
db.test_date.find({mark_time:{$gte: new Date('2021-03-12 12:11:57')}})
# 数据库存储的格式为ISODate,此时等价于
db.test_date.find({mark_time:{$gte: ISODate('2021-03-12T04:11:57.943Z')}})
# 
db.test_date.find({mark_time:{
$gt: ISODate('2000-01-01T00:00:00.000Z'), 
$lt: ISODate('2100-01-01T00:00:00.000Z')}})

demo 二:

# 创建表
> db.createCollection("test_date")
{ "ok" : 1 }
# 插入数据
# 国际时间 (推荐)
> db.test_date.insert({mark:1, mark_time:new Date()})
# 北京时间
> db.test_date.insert({mark:2, mark_time:Date()})
# 查询
> db.test_date.find()
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
{ "_id" : ObjectId("604ace485c4ea57ac80d7667"), "mark" : 2, "mark_time" : "Fri Mar 12 2021 10:13:28 GMT+0800 (CST)" }
# 2021/03/12 10:11:57 和 2021/03/12 10:13:28
>
>
> db.test_date.findOne({mark:1})
{
"_id" : ObjectId("604acded5c4ea57ac80d7666"),
"mark" : 1,
"mark_time" : ISODate("2021-03-12T02:11:57.943Z")
}
>
>
> db.test_date.findOne({mark:1}).mark_time
ISODate("2021-03-12T02:11:57.943Z")
>
>
> x=db.test_date.findOne({mark:1}).mark_time
ISODate("2021-03-12T02:11:57.943Z")
>
>
> x.getFullYear()
2021
> 
> x.getMonth() # js中的月份是从0开始的(0-11)
2
> x.getMonth()+1
3
> x.getDate()
12
> x.getHours() #注意这里获取到的小时是10,而不是2
10
> x.getMinutes()
11
> x.getSeconds()
57
>
>
>
# ISO的日期类型可以直接使用new Date来进行比较,直接使用+8后的时间即可(注意字符串使用“/”分隔符也可):
# 北京时间格式查询
> db.test_date.find({mark_time:{$gt: new Date('2021-03-12 10:11:57')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
>
> db.test_date.find({mark_time:{$gt: new Date('2020-03-12 10:11:57')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
> 
> 
# 国际时间格式查询
> db.test_date.find({mark_time:{$gt: ISODate('2000-01-01T00:00:00.000Z'), $lt: ISODate('2100-01-01T00:00:00.000Z')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
# 北京/国际时间格式查询,发现都查询不到 存储的北京时间item
>
# 采用如下方法,只能查询北京时间,不能查到存储的国际时间item
> db.test_date.find({"mark_time":{$gt:"2000-01-01 00:00:00"}}) 
{ "_id" : ObjectId("604ace485c4ea57ac80d7667"), "mark" : 2, "mark_time" : "Fri Mar 12 2021 10:13:28 GMT+0800 (CST)" }
>
> 
> db.test_date.insert({mark:3, mark_time:ISODate()})
WriteResult({ "nInserted" : 1 })
> 
> 
> 
> db.test_date.find()
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
{ "_id" : ObjectId("604ace485c4ea57ac80d7667"), "mark" : 2, "mark_time" : "Fri Mar 12 2021 10:13:28 GMT+0800 (CST)" }
{ "_id" : ObjectId("604ae05829d541273f368200"), "mark" : 3, "mark_time" : ISODate("2021-03-12T03:30:32.736Z") }
> 
> 
> 
> db.test_date.find({"mark_time":{$gt:"2000-01-01 00:00:00"}}) 
{ "_id" : ObjectId("604ace485c4ea57ac80d7667"), "mark" : 2, "mark_time" : "Fri Mar 12 2021 10:13:28 GMT+0800 (CST)" }
> 
> 
> db.test_date.find({mark_time:{$gt: new Date('2020-03-12 10:11:57')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
{ "_id" : ObjectId("604ae05829d541273f368200"), "mark" : 3, "mark_time" : ISODate("2021-03-12T03:30:32.736Z") }
> 
> 
> 
> db.test_date.find({mark_time:{$gt: ISODate('2020-03-12 10:11:57')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
{ "_id" : ObjectId("604ae05829d541273f368200"), "mark" : 3, "mark_time" : ISODate("2021-03-12T03:30:32.736Z") }
> 
> 
> 
> 
> 
> db.test_date.find({mark_time:{$gte: ISODate('2000-01-01T00:00:00.000Z'), $lt: ISODate('2100-01-01T00:00:00.000Z')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
{ "_id" : ObjectId("604ae05829d541273f368200"), "mark" : 3, "mark_time" : ISODate("2021-03-12T03:30:32.736Z") }
> 
> 
> 
> db.test_date.find({mark_time:{$gte: new Date('2000-01-01T00:00:00.000Z'), $lt: ISODate('2100-01-01T00:00:00.000Z')}})
{ "_id" : ObjectId("604acded5c4ea57ac80d7666"), "mark" : 1, "mark_time" : ISODate("2021-03-12T02:11:57.943Z") }
{ "_id" : ObjectId("604ae05829d541273f368200"), "mark" : 3, "mark_time" : ISODate("2021-03-12T03:30:32.736Z") }
> 
> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值