我从数据库中得到一些时间,并且我试图使用纪元表单按月存储它们。 所以我可以有一些随机的时间,如:
1354120744
1328978360
1297388332
对于每一个我想找到代表该月第一个的纪元值 所以最后的时间戳是:
1296518400
(使用可爱的epochconverter.com
)。
我知道我可以使用POSIX mktime
将时间戳减少到几天,等等并相应地更改它们,就像我之前做过的帖子的回答一样:How to go back months in Perl taking account of different days in month?
我遇到的麻烦是,虽然我可以零次,但我担心通过更改日期与星期几不匹配,所以基本上是无效日期。这可能是一种不必要的担心;如果时间得到验证,我不知道如果一周中的错误日期会有所不同。
我看不到任何其他似乎有用的POSIX方法。任何帮助表示赞赏!
答案 0 :(得分:9)
自从我遇到DateTime后,我就不再担心时间戳问题了:
$ perl -MDateTime -E 'say DateTime->from_epoch(epoch => 1354120744)->truncate(to => "month")->epoch;'
1351728000
答案 1 :(得分:5)
我的第一个想法是使用Time::Local将localtime
结果转换回纪元,并根据需要将适当的值强制为0或1。请注意,星期几不是它所期望的输入值之一,因此您不必担心如果出错则会发生什么。
$start_of_month_epoch = timelocal(0, 0, 0, 1, $month, $year);
答案 2 :(得分:1)
出于此确切原因,我遇到的麻烦是,虽然我可以零次,但我担心通过更改日期与星期几不匹配,所以基本上是无效日期。
mktime(3)
会忽略wday
,yday
和isdst
字段。您可以安全地将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];