【问题标题】:Perl How to insert datetime in mongodbPerl如何在mongodb中插入日期时间
【发布时间】:2018-08-18 01:05:49
【问题描述】:

我是 MongoDB 的新手,我在 2018-08-13 09:56:19 这样的数组中有 MySQL 格式的日期,我想在 MongoDB 中存储一个带有 time_zone -0500 的 ISODate,这样日期就会像 "Date" : ISODate("2018-08-13T09:56:19.000-05:00") 一样插入到 Perl

感谢任何帮助...

【问题讨论】:

  • 您似乎有两个不相关的问题?请将它们作为单独的问题发布。
  • 我使用 Cpanel::JSON::XS。它的encode_jsonCpanel::JSON::XS->new->utf8->encode 的缩写。它生成使用 UTF-8 编码的 JSON。它不提供名为 to_json 的函数,该函数通常会生成未编码的 JSON。你可以使用Cpanel::JSON::XS->new->encode
  • convert_blessed 有什么问题?
  • @ikegami 这些问题仅用于知识目的。我的主要问题是我如何将自定义日期(来自 MySQL 格式)插入 MongoDB ISODate。
  • 我对 MongoDB 一无所知。

标签: mongodb perl


【解决方案1】:

你需要使用一个DateTime 解析器,它会使用 MySQL 的格式,但是 MongoDB 会正确地转换 DateTime 对象。但是,为了提高效率,查询时它不会自动膨胀回 DateTime 对象,而是使用中间形式 BSON::Time。有一种方法,as_datetime,可以获取 DateTime 对象。

请看下面的例子:

use Data::Dumper;
use DateTime::Format::MySQL;
use DateTime::Format::RFC3339;
use MongoDB;

# parse the date
my $dt = DateTime::Format::MySQL->parse_datetime( '2003-01-16 23:12:01' );
$dt->set_formatter("DateTime::Format::RFC3339");
say $dt;
# 2003-01-16T23:12:01+00:00

# set TZ
$dt->set_time_zone("America/New_York");
say $dt;
# 2003-01-16T23:12:01-05:00

# connect to the DB and get a MongoDB::Collection to work with
my $mc = MongoDB->connect("mongodb://localhost:27017");
my $coll = $mc->ns('test.foo');

# insert
$coll->insert_one({ date => $dt });

# query
my $doc = $coll->find_one({date => $dt});

# dump the doc -- note the date is now a BSON::Time and there's a
# MongoDB '_id' field added
say Dumper $doc;
# $VAR1 = {
#           '_id' => bless( {
#                             'oid' => '[vöZN@®G¿Ç'
#                           }, 'BSON::OID' ),
#           'date' => bless( {
#                              'value' => '1042776721000'
#                            }, 'BSON::Time' )
#         };

# get it back as a DateTime object and print it out
my $date = $doc->{date}->as_datetime;
$date->set_formatter("DateTime::Format::RFC3339");
say $date;
# 2003-01-17T04:12:01Z
$date->set_time_zone("America/New_York");
say $date;
# 2003-01-16T23:12:01-05:00

【讨论】:

  • 对于时区位,您需要学习使用 DateTime 对象,无论是在解析时还是在往返之后,因为 MongoDB 日期时间仅使用 UTC。
  • 非常感谢您的帮助。日期作为 ISODate 存储在 MongoDB 中,但默认情况下会添加不同的时区。我如何强制它使用 -0500 时区存储日期。
  • 我不完全确定我理解你的问题。您可以在解析后调用上例中的$dt->set_date_time("America/New_York") 将时区附加到解析的日期时间。然后,当您插入 MongoDB 时,它将“正确”存储(自 unix 纪元以来的毫秒数)。当您将其作为$date 拉出时,您可以再次调用$date->set_time_zone("America/New_York") 为其附加时区。我将编辑上面的代码并打印出来,这样你就可以看到发生了什么。
  • 另外,如果您发现我已经回答了您的问题,请点击复选标记接受答案。
  • 我再次修改了代码以使用更清晰地显示时区数据的不同格式化程序。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多