我从数据库中获得了一些时间,我正在尝试使用纪元形式按月存储它们。所以我可以有一些随机的时间,例如:
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)
忽略了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];