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

时间:2015-02-10 13:06:07

标签: perl datetime

我有以字符串格式的日期,我需要使用Perl脚本将其转换为毫秒。我试图使用DateTime::Format::Strptime转换它,并在转换为毫秒后返回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";

如何将datetime转换为毫秒

3 个答案:

答案 0 :(得分:4)

我认为你想要的不是毫秒而是epoch,这是自1970年1月1日以来的数量。你的日期 - 时间格式既没有秒也没有毫秒,所以这两个字段都会报告为零,如果你真的想要毫秒,那么你可以简单地将epoch乘以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;

<强>输出

1421158560

然而,DateTime模块是巨大而缓慢的,核心模块Time::Piece中有一个更好的解决方案,看起来像这样

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

答案 1 :(得分:2)

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

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

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

say $dt->epoch;

要获得毫秒数,只需将其乘以一千。

say 1000 * $dt->epoch;

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

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

答案 2 :(得分:1)

添加我的评论作为答案:

如果您想将日期时间值转换为自纪元以来的秒数,请尝试以下方法之一:

print sprintf("%f", $dt->epoch + ($dt->millisecond/1000));
print sprintf("%s.%s", $dt->epoch, $dt->millisecond);

(我原来的评论没有说明毫秒是一个整数)

类似于以毫秒为单位的值,而不是秒.millis:

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

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