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



我从数据库中获得了一些时间,我正在尝试使用纪元形式按月存储它们。所以我可以有一些随机的时间,例如:

1354120744
1328978360
1297388332

对于每一个,我想找到代表该月1日的纪元值因此,对于最后一个时间戳,它将是:

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

我知道我可以使用POSIX mktime将时间戳减少到天、分钟等,并相应地更改它们等,就像我不久前所做的一篇文章的答案一样:如何在 Perl 中考虑到每月的不同天数回到几个月?

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

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

自从我遇到DateTime以来,我不再担心时间戳问题:

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

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

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

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

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];

最新更新