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

Parse date String to milliseconds and vice versa

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

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

无法将日期转换为毫秒。日期是时间点。毫秒衡量持续时间。

如果我们假设您的意思是 "how many milliseconds are there between my given date/time and some other fixed date/time",您的问题唯一有意义的方法。由于 Unix 测量时间的方式,我们假设您测量的固定 date/time 是 Unix 纪元 (1970-01-01 00:00:00).

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

say $dt->epoch;

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

say 1000 * $dt->epoch;

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

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

我认为您想要的可能不是毫秒而是 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

添加我的评论作为答案:

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

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

(我原来的评论没有考虑毫秒是整数)

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

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

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