如何从Perl中的随机时间戳中获取以纪元形式开始的月份?

时间:2012-11-28 17:07:25

标签: perl epoch localtime

我从数据库中得到一些时间,并且我试图使用纪元表单按月存储它们。 所以我可以有一些随机的时间,如:

1354120744
1328978360
1297388332

对于每一个我想找到代表该月第一个的纪元值 所以最后的时间戳是:

1296518400(使用可爱的epochconverter.com)。

我知道我可以使用POSIX mktime将时间戳减少到几天,等等并相应地更改它们,就像我之前做过的帖子的回答一样:How to go back months in Perl taking account of different days in month?

我遇到的麻烦是,虽然我可以零次,但我担心通过更改日期与星期几不匹配,所以基本上是无效日期。这可能是一种不必要的担心;如果时间得到验证,我不知道如果一周中的错误日期会有所不同。

我看不到任何其他似乎有用的POSIX方法。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:9)

自从我遇到DateTime后,我就不再担心时间戳问题了:

$ perl -MDateTime -E 'say DateTime->from_epoch(epoch => 1354120744)->truncate(to => "month")->epoch;'
1351728000

答案 1 :(得分:5)

我的第一个想法是使用Time::Locallocaltime结果转换回纪元,并根据需要将适当的值强制为0或1。请注意,星期几不是它所期望的输入值之一,因此您不必担心如果出错则会发生什么。

$start_of_month_epoch = timelocal(0, 0, 0, 1, $month, $year);

答案 2 :(得分:1)

  

我遇到的麻烦是,虽然我可以零次,但我担心通过更改日期与星期几不匹配,所以基本上是无效日期。

出于此确切原因,

mktime(3)会忽略wdayydayisdst字段。您可以安全地将mday调整为1,然后再次调用POSIX::mktime()将其重新设置为纪元值。

my @t = localtime();
$t[0] = $t[1] = $t[2] = 0; # sec/min/hour
$t[3] = 1;                 # mday
my $epoch_start_of_month = mktime @t;

或更简单

my $epoch = mktime 0, 0, 0, 1, (localtime)[4,5];