Perl MongoDB 驱动程序使用 DateTime 对象来存储日期,如果您从数据库中读取日期,则将 DateTime 对象返回给您。
#!/usr/bin/env perl
use strict;
use warnings;
use MongoDB;
use MongoDB::OID;
use DateTime;
# database connection & collection
my $conn = MongoDB::Connection->new;
my $db = $conn->dates;
my $log = $db->log;
# Delete Collection
$log->drop;
# Insert one
my $oid = $log->insert({ dt => DateTime->now });
# Show all
my $all = $log->find;
while ( my $entry = $all->next ) {
printf "_id: %s dt: %s\n", $entry->{_id}->to_string, $entry->{dt}->format_cldr("dd.MM.yyyy HH:mm:ss");
}
如果你执行它,它会打印出类似
_id: 50cb1b9321d30efd17000000 dt: 14.12.2012 12:29:07
您还应该阅读 DateTime 文档以了解您可以使用它做什么:http ://search.cpan.org/perldoc?DateTime
在 Connection 启动时,您还可以设置所需的 Date 对象。
http://search.cpan.org/perldoc?MongoDB::Connection#dt_type
例如,如果将其设置为 DateTime::Tiny,它会更快。但是您应该首先了解 DateTime 和 DateTime::Tiny 之间的区别。阅读展位文档并决定哪种情况更好。
上面的示例创建了客户端时间。如果您想要来自服务器而不是客户端的时间,因为客户端/服务器不一样。你可以做两件事。
首先,创建一个返回 Date 对象的 JavaScript 函数并在服务器上评估该函数。
# JavaScript function that return a Date object
my $now = MongoDB::Code->new(code => qq{function(){
return new Date
}});
# later...
my $oid = $log->insert({
dt => $dt,
st => $db->eval($now),
});
第二种可能。MongoDB 的默认“_id”对象已经包含创建对象时的时间戳。至少文档说它来自服务器,我希望它真的来自服务器并且不会由驱动程序创建。但是,如果 $entry 是您的 MongoDB 结果,您可以通过以下方式从中获取 DateTime 对象:
my $dt = DateTime->from_epoch(epoch => $entry->{_id}->get_time);
例子:
#!/usr/bin/env perl
use strict;
use warnings;
use MongoDB;
use MongoDB::OID;
use MongoDB::Code;
use DateTime;
# database connection & collection
my $conn = MongoDB::Connection->new;
my $db = $conn->dates;
my $log = $db->log;
# Delete Collection
$log->drop;
# Client Time
my $dt = DateTime->now;
# JavaScript function that return a Date object
my $now = MongoDB::Code->new(code => qq{function(){
return new Date
}});
# wait 2 seconds to see a difference between
# $dt and the $now function
sleep 2;
# Insert one
$log->insert({
dt => $dt,
st => $db->eval($now),
});
sleep 2;
$log->insert({
dt => $dt,
st => $db->eval($now),
});
# Show all
my $dtf = "dd.MM.yyyy HH:mm:ss";
my $all = $log->find;
while ( my $entry = $all->next ) {
printf "dt: %s\n", $entry->{dt}->format_cldr($dtf);
printf "st: %s\n", $entry->{st}->format_cldr($dtf);
printf "_id time: %s\n", DateTime->from_epoch(epoch => $entry->{_id}->get_time)->format_cldr($dtf);
print "\n";
}
输出:
dt: 14.12.2012 16:29:28
st: 14.12.2012 16:29:30
_id time: 14.12.2012 16:29:30
dt: 14.12.2012 16:29:28
st: 14.12.2012 16:29:32
_id time: 14.12.2012 16:29:32