2012-04-27 9 views
1

これを説明する最善の方法はわかりませんが、時間差(切り捨て)を計算する必要があります(午後8時から午前6時(あるいは20時06分:この場合、00)例えばJavaScriptの時差を計算しているが、特定の時間だけを計算する

:!一部は複数の日にまたがっますので

22:00 - 04:00 (6 hours) 
02:40 - 10:20 (4 hours) 
20:00 - 06:00 (10 hours) 

は、残念ながら私は、正確な日付に作業する必要がある - とだけ、混乱に追加するまた、私はする必要が(私は配列のリストを持っています)を特定の日付から完全に除外しますが、実装方法はまったく分かりませんこれは、 - 任意の提案は非常に歓迎されるでしょう、あなたに

+0

私たちはあなたの入力データのサンプルを見ることができますか?あなたは完全な日付で働いているのですか? –

+0

3番目の例の違い(10時間)は、2番目の例として(2時間)にする必要があります。 – ocanal

答えて

4

に感謝するだけオフに行くことはあなたのサンプル中の入力がどのように見えるか:

// According to your example, your inputs are strings... 
// t1 = "22:00" 
// t2 = "04:00"; 

function hoursDiff(t1, t2){ 

    // Parse out the times, using radix 10 to 
    // avoid octal edge cases ("08:00" & "09:00") 
    var time1 = parseInt(t1, 10); 
    var time2 = parseInt(t2, 10); 
    var hours = 0; 

    while (time1 !== time2){ 
     time1++; 
     hours++; 

     // If we've passed midnight, reset 
     // to 01:00AM 
     if (time1 === 25){ 
     time1 = 1; 
     } 
    } 

    return hours; 
} 
+0

多くのおかげで、これは私が思いついた解決法と比較して信じられないほど単純です(良い方法で!)が、私はそれがちょうどうまくいくかもしれないという気持ちがあります!私は仕事に戻ってすぐにそれを実装しようとする、ありがとうございます:) – Nick

+0

あまりにも、この答えは間違っています。 'parseInt(" 08:00 ")'を試してみると、 '0'が返されます。文字列がゼロで始まるとき、 'parseInt'はデフォルトでそれを8進数として解釈します。これは00-07には有効ですが、08と09は無効です。 'parseInt(t、10)'を使う必要がありますが、これはあなたの質問に正しく答えられません。 – Bart

+1

@Bart:あなたはそれについて絶対に正しいです。私は、8進数の場合について説明するために投稿を更新しました。私はずっとそれをやっていたはずです。素晴らしいキャッチ! –

1

[OK]を、これは素敵なパズルでした。それは本当に私に余りに多くの時間を要したが、それは楽しいものだった。

以下の全作業コード(jsfiddle here):

function isHoliday(/*Date*/ date) { 
    for(var i = 0; i < holidays.length; i++) { 
     if(holidays[i].getTime() == date.getTime()) { 
      return true; 
     } 
    } 
    return false; 
} 

function diffHours(/*Date*/ d1, /*Date*/ d2) { 
    var date1 = new Date(d1.getUTCFullYear()+"-"+(d1.getUTCMonth()+1)+"-"+d1.getUTCDate()+" UTC"); 
    var date2 = new Date(d2.getUTCFullYear()+"-"+(d2.getUTCMonth()+1)+"-"+d2.getUTCDate()+" UTC"); 

    var sum = 0; 
    var oneday = 24*3600*1000; 
    var hours, date; 

    // first day 
    if(!isHoliday(date1)) { 
     // decrease by a whole day first (will be added later) 
     sum -= 10; 

     // add real hours 
     hours = d1.getUTCHours() + d1.getUTCMinutes()/60; 
     if(hours <= 6) { 
      sum += 10 - hours; 
     } else if(hours <= 20) { 
      sum += 4; 
     } else { 
      sum += 24 - hours; 
     } 
    } 

    // last day 
    if(!isHoliday(date2)) { 
     // decrease by a whole day first (will be added later) 
     sum -= 10; 

     // add real hours 
     hours = d2.getUTCHours() + d2.getUTCMinutes()/60; 
     if(hours <= 6) { 
      sum += hours; 
     } else if(hours <= 20) { 
      sum += 6; 
     } else { 
      sum += hours - 14; 
     } 
    } 

    // whole days 
    while(date1 <= date2) { 
     if(!isHoliday(date1)) { 
      sum += 10; 
     } 

     // increase date by 1 day 
     date1.setTime(date1.getTime() + oneday); 
    } 

    return Math.floor(sum); 
} 

// ============== 
// examples below 
// -------------- 

// array of Dates (in UTC) to skip 
var holidays = [ 
    new Date("2012-01-04 UTC"), 
]; 

for(var i = 0; i < holidays.length; i++) { 
    console.log('holiday: ', holidays[i].toUTCString()); 
} 

a = new Date("2012-01-01 12:00 UTC"); 
b = new Date("2012-01-02 12:00 UTC"); 
c = new Date("2012-01-02 22:00 UTC"); 
d = new Date("2012-01-03 07:00 UTC"); 
e = new Date("2012-01-05 12:00 UTC"); 

console.log({d1: a.toUTCString(), d2: b.toUTCString(), hours: diffHours(a, b)}); 
console.log({d1: b.toUTCString(), d2: c.toUTCString(), hours: diffHours(b, c)}); 
console.log({d1: c.toUTCString(), d2: d.toUTCString(), hours: diffHours(c, d)}); 
console.log({d1: d.toUTCString(), d2: e.toUTCString(), hours: diffHours(d, e)}); 
+0

このバートのおかげさまで大変ありがとうございます。残念ながら私は既に上記のajax81のコードに基づいた同様のソリューションを思いついたので、誰に賞金をあげるのかは不明です!私はそれを分けることができれば幸いです。しかし、あなたの答えは、私がこの場合に必要なものを正確に行うので、私は彼に正しい答えを与え、あなたは賞金を得ます。 – Nick