2010-12-14 6 views
2

日付範囲(2つのUNIXタイムスタンプ)があり、23:59:59にポイントを見つける必要があります。 どのように私はPerlでそれをすることができますか?2つのUNIXタイムスタンプの間に1日の変更ポイントを取得

P.S.私は非常に大きな範囲を持つことができるので、()は良い考えではないと思います。何か他の変種?

+0

エポック秒を意味しますか? – DVK

答えて

5

私はDate::Calcを使用します。あなたの2つのタイムスタンプが$ts1$ts2に位置していると仮定します

use Date::Calc qw(Time_to_Date Date_to_Time Delta_Days Add_Delta_Days); 

my @date1 = (Time_to_Date($ts1))[0..2]; 
my @date2 = (Time_to_Date($ts2))[0..2]; 
my @midnights; 

for (my $i = 0; $i < Delta_Days(@date1, @date2); ++$i) { 
    push @midnights, Date_to_Time(Add_Delta_Days(@date1, $i), 23, 59, 59); 
} 

@midnightsは今、二つの与えられたタイムスタンプとの間のすべての23時59分59秒のポイント(複数可)のUNIXタイムスタンプ(エポック秒)が含まれています。

免責事項:もちろん、DateTimeで行うこともできます。ここで

+0

ありがとう、それは私が必要なものです! – VeroLom

2

これは一般的なアルゴリズムです。 Xは、最初の変更日付を取得します)Yは、最後の1

1である第一のタイムスタンプで、Z.

If Z > Y , there is no change. 

2)

If W = Z, there is only one change date. 

W 3、最後の変更の日付を取得)を取得します日付の範囲、R. 1日の範囲を考慮すると、

R = W - Z .. The number of points will be the integer of (W - Z)/D 
1

はしかし、他のみんなと同じように、私が使用してことをお勧めUNIXタイムスタンプ(学校は、このような長い時間前にある...)

while (entry) { 
    if ((timestamp-1) % 86400 == 0) { 
     #match 
    } else { 
     #nomatch 
    } 
} 

の私の半最近の知見に基づいて、私は一緒に廃棄例です私の例ではうるう秒を考慮していないので、POSIXに準拠しているかどうかは疑問です。詳細情報here

関連する問題