Perl 将日期字符串解析为毫秒,反之亦然

Perl 将日期字符串解析为毫秒,反之亦然,perl,datetime,Perl,Datetime,我有以下字符串格式的日期,需要使用Perl脚本将其转换为毫秒。我尝试使用DateTime::Format::strtime转换它,转换为毫秒后返回0 日期字符串:01-13-15:14.16 #!/usr/bin/perl use DateTime::Format::Strptime; my $strp = DateTime::Format::Strptime->new( pattern => '%m-%d-%y:%H.%M', on_error => 'cr

我有以下字符串格式的日期,需要使用Perl脚本将其转换为毫秒。我尝试使用
DateTime::Format::strtime
转换它,转换为毫秒后返回0

日期字符串:01-13-15:14.16

#!/usr/bin/perl
use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
    pattern => '%m-%d-%y:%H.%M',
    on_error => 'croak',
);

my $dt = $strp->parse_datetime("01-13-15:14.16");

print $dt->millisecond."\n";

如何将日期时间转换为毫秒

不可能将日期转换为毫秒。日期是一个时间点。毫秒表示持续时间

你的问题唯一有意义的方法是假设你的意思是“我给定的日期/时间和其他固定的日期/时间之间有多少毫秒”。由于Unix测量时间的方式,让我们假设您测量的固定日期/时间是Unix纪元(1970-01-01 00:00:00)

您可以使用
epoch()
方法从DateTime对象获取自历元以来的秒数

say $dt->epoch;
要获得毫秒数,只需将其乘以1000即可

say 1000 * $dt->epoch;
您当前的时间戳不包括毫秒。如果您更改为解析包含它们的字符串,那么您也可以添加该值

say $dt->milliseconds + (1000 * $dt->epoch);

我认为你想要的可能不是毫秒而是纪元,这是自1970年1月1日以来的秒数。日期时间格式既没有秒也没有毫秒,因此这两个字段都将报告为零,如果您确实需要毫秒,则只需将
历元
乘以1000即可

看起来像这样

use strict;
use warnings;
use 5.010;

use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
    pattern => '%m-%d-%y:%H.%M',
    on_error => 'croak',
);

my $dt = $strp->parse_datetime('01-13-15:14.16');
say $dt->epoch;
use strict;
use warnings;
use 5.010;

use Time::Piece;

my $dt = Time::Piece->strptime('01-13-15:14.16', '%m-%d-%y:%H.%M');
say $dt->epoch;
输出

1421158560
1421158560
然而,
DateTime
模块庞大而缓慢,在核心模块中有一个更好的解决方案,如下所示

use strict;
use warnings;
use 5.010;

use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(
    pattern => '%m-%d-%y:%H.%M',
    on_error => 'croak',
);

my $dt = $strp->parse_datetime('01-13-15:14.16');
say $dt->epoch;
use strict;
use warnings;
use 5.010;

use Time::Piece;

my $dt = Time::Piece->strptime('01-13-15:14.16', '%m-%d-%y:%H.%M');
say $dt->epoch;
输出

1421158560
1421158560

添加我的评论作为回答:

如果要将datetime值转换为自历元起的秒数,请尝试以下操作之一:

print sprintf("%f", $dt->epoch + ($dt->millisecond/1000));
print sprintf("%s.%s", $dt->epoch, $dt->millisecond);
(我最初的评论没有说明毫秒是整数)

与以毫秒为单位的值类似,而不是以秒为单位的值。毫秒:

print sprintf("%d", ($dt->epoch * 1000) + $dt->millisecond);
print sprintf("%d%04d", $dt->epoch, $dt->millisecond);

请记住,如果不为DateTime提供包含毫秒(或更高分辨率)的值,则该值将仅为零。

如果不转换为毫秒,则只返回时间的毫秒分数,即0。请更好地解释您希望在这里实现什么,我们将能够帮助您我想将日期字符串转换为毫秒。这就是我在阅读完这些例子后试图做的。如果没有毫秒部分,它返回的datetime为
2015-01-13T14:16:00
您正在解析没有设置毫秒的datetime,因此您将有0毫秒返回。任何比你传入的分辨率更高的分辨率都会导致零(它不仅仅是由稀薄的空气组成的),你还不清楚你想从中得到什么。如果要将日期时间转换为自历元起的秒数,请使用该选项<代码>打印sprintf(“%f”,$dt->epoch+$dt->毫秒)@DavidK-J:表达式
$dt->epoch+$dt->毫秒
毫无意义,因为
epoch
以秒为单位,而
毫秒
以毫秒为单位。然而,由于
毫秒总是为零,因此添加它没有意义,而且OP真正想要的似乎只是
$dt->epoch
@Borodin,
$dt->epoch*1000+$dt->millister
(在本例中与
$dt->epoch*1000
相同)是有意义的,我想你是说
比如说1000*$dt->epoch+$dt->毫秒
谢谢。我将修改脚本以使用
Time::Piece
而不是
DateTime