将日期字符串解析为毫秒,反之亦然
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 提供包含毫秒(或更高分辨率)的值,则该值将仅为零。
我有以下字符串格式的日期,我需要使用 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 提供包含毫秒(或更高分辨率)的值,则该值将仅为零。