3

データベースからいくつかの時間を取得し、エポック形式を使用して月ごとに保存しようとしています。したがって、次のようなランダムな時間を持つことができます。

1354120744
1328978360
1297388332

そして、それぞれについて、その月の1日を表すエポック値を見つけたいので、最後のタイムスタンプは次のようになります。

1296518400(素敵なを使用epochconverter.com)。

POSIX mktime少し前に行った投稿への回答のように、タイムスタンプを日、分などに減らし、それに応じて変更するために使用できることを知っています。

私が抱えている問題は、ゼロ回はできますが、日付を変更すると曜日が一致しないのではないかと心配しているため、本質的に無効な日付になります。これは不必要な心配かもしれません。時間が検証されている場合、曜日が間違っていることに違いがあるかどうかはわかりません。

有用と思われる他の 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::Localを使用して結果を元のエポックに変換しlocaltime、必要に応じて適切な値を 0 または 1 に強制することです。期待する入力値に曜日が含まれていないことに注意してください。間違った場合にどうなるかを心配する必要はありません。

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

于 2012-11-28T17:13:48.723 に答える
1

私が抱えている問題は、ゼロ回はできますが、日付を変更すると曜日が一致しないのではないかと心配しているため、本質的に無効な日付になります。

mktime(3)は、まさにこの理由でwdayydayおよびフィールドを無視します。isdstを安全に 1 に調整してから、もう一度mday呼び出してエポック値に戻すことができます。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 に答える