1

私には2つの数字があります。Unixエポック形式の日付。

2つのUnixエポックタイムスタンプがあるとします。

1349422200 = 05/10/2012 08:30
1350489600 = 17/10/2012 17:00

2つの日時の間に何日あるかを知ることができます。問題ありません。私が解決したいのは、それらの日の何日が土曜日または日曜日(非平日)であるかということです。これを実行する簡単な方法が必要だと確信していますが、for()ループを大量に実行せずに、これを理解することはできません。

どんな助けでも大歓迎です。

4

2 に答える 2

2

週末の定義をより具体的にしてください。週末全体(土曜日と日曜日の48時間全体)のみを含めますか?または、金曜日の夜/土曜日の朝の深夜を含む時間の範囲は週末としてカウントされますか?週末の半分は半分としてカウントされますか、それとも最も近い整数に丸めますか?

とにかく:

  1. 週末を構成するものを理解する
  2. あなたの時間の範囲で最初と最後の週末を見つけてください
  3. それらの間の時差を日数で見つけ、7で割ります

編集:四捨五入せずに、週末の正確な時間を求めています。

まず、タイムスパンを3つのチャンクに分割します。

  1. 範囲の最初から月曜日の朝の真夜中までのすべて
  2. 前のブロックの終わりから月曜日の午前0時までのすべて
  3. 前のブロックの終わりから範囲の終わりまでのすべて

次に、各ブロックの週末の量を計算し、それらを合計します。

  1. 最初のブロックの長さがゼロの場合、週末の時間は含まれません。長さが48時間以下の場合、週末の時間はその長さに等しくなります。それ以外の場合、週末の時間は48時間になります。
  2. 真ん中のブロックの週末の時間は、その期間に2/7を掛​​けたものです(開始と終了の制限により、整数週間であるため、些細なことです)。
  3. 期間が5日以下の場合、最後のブロックには週末の時間が含まれません。期間が5日を超える場合、週末の時間は期間から5日を引いたものに等しくなります。

特殊なケース

ブロックに月曜日の深夜が含まれていない場合は、2番目と3番目のブロックの長さがゼロであると見なしてください。ブロック内のある週末の始まりと終わり(存在する場合)を見つけて、オーバーラップを計算します。

ブロックに月曜日の真夜中がちょうど1つ含まれている場合は、最初のブロックをその前の時間、2番目のブロックの長さをゼロ、3番目のブロックをその後の時間と見なし、通常どおり計算します。

于 2012-10-08T14:27:20.043 に答える
0

これを回避するには、はるかに高速でプロセッサをあまり必要としない方法があると確信しています。しかし、私にとってこの方法は十分に優れていて、仕事を成し遂げます。

//$sDateRaw = First day at 00:00 in Unix Epoch
//$eDateRaw = Last day(+1) at 00:00 in Unix Epoch
//86400 = Number of seconds in 1 day

for($i=$sDateRaw;$i<$eDateRaw; $i+=86400){
    if(date("N",$i) != 6 && date("N",$i) != 7){
        $weekDays += 1;
    }
}
//$weekDays = Total number of days excluding weekends
于 2012-10-09T09:13:38.347 に答える