3

我从数据库中得到了一些时间,我试图使用 epoch 形式按月存储它们。所以我可以有一些随机的时间,比如:

1354120744
1328978360
1297388332

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

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

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

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

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

4

3 回答 3

9

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

$ perl -MDateTime -E 'say DateTime->from_epoch(epoch => 1354120744)->truncate(to => "month")->epoch;'
1351728000
于 2012-11-28T17:22:17.957 回答
5

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

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

于 2012-11-28T17:13:48.723 回答
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];
于 2012-11-29T16:15:39.737 回答