Czy ktoś ma pomysły na to, jak najlepiej obliczyć liczbę dni przecinających się między dwoma zakresami dat?Liczba dni przecinających się między dwoma zakresami dat
Odpowiedz
Uzyskaj nowy zakres, zdefiniowany przez późniejszy z początków i wcześniejszych końców, i określ liczbę dni od początku epoki dla każdego dnia w tym nowym zakresie.
Różnica polega na liczbie dni na przecięciu. Akceptuj tylko pozytywne wartości.
Edytowany w celu uwzględnienia zakresów zamiast poszczególnych dat.
Pytanie dotyczy dwóch zakresów dat, a nie dwóch dat. (Edytowane w odpowiedzi na komentarze)
Więc jeśli masz 2 zakresy dat (r1s, r1e), musisz określić, który z nich rozpoczyna się pierwszy, czy pokrywają się one i jakie są nakładające się wartości.
double overlap(DateTime r1s, DateTime r1e, DateTime r2s, DateTime r1e){
DateTime t1s,t1e,t2s,t2e;
if (rs1<rs2) //Determine which range starts first
{
t1s = r1s;
t1e = r1e;
t2s = r2s;
t2e = r2e;
}
else
}
t1s = r2s;
t1e = r2e;
t2s = r1s;
t2e = r1e;
}
if (t1e<t2s) //No Overlap
{
return -1;
}
if (t1e<t2e) //Partial Overlap
}
TimeSpan diff = new TimeSpan(t1e.Ticks - t2s.Ticks);
{
else //Range 2 totally withing Range 1
}
TimeSpan diff = new TimeSpan(t2e.Ticks - t2s.Ticks);
{
double daysDiff = diff.TotalDays;
return daysDiff;
}
"Załóżmy, że T1s jest zawsze
Masz rację. Również ja (i powyższe odpowiedzi) zakładamy, że się pokrywają. Musimy również przetestować to. – WombatPM
Jeśli rozumiem Twoje pytanie, prosisz o liczbie dni, które pokrywają się dwa zakresy dat, takich jak: Zakres 1 = 01.01.2010 do 01.02.2010 Zakres 2 = 2010-1-5 do 2010-2-5 w tym przykładzie liczba przecinających się dni wynosi 28 dni.
Oto przykładowy kod dla tego przykładu
DateTime rs1 = new DateTime(2010, 1, 1);
DateTime re1 = new DateTime(2010, 2, 1);
DateTime rs2 = new DateTime(2010, 1, 5);
DateTime re2 = new DateTime(2010, 2, 5);
TimeSpan d = new TimeSpan(Math.Max(Math.Min(re1.Ticks, re2.Ticks) - Math.Max(rs1.Ticks, rs2.Ticks) + TimeSpan.TicksPerDay, 0));
Oto przykład z R. To mogłoby wyjaśnić odpowiedź.
c_st = as.POSIXct("1996-10-14")
c_ed = as.POSIXct("1996-10-19")
d_st = as.POSIXct("1996-10-17")
d_ed = as.POSIXct("1999-10-22")
max(range(c_st,c_ed))-min(range(d_st,d_ed)) >= 0 & min(range(c_st,c_ed)) < max(range(d_st,d_ed))
Prawda oznacza, że przecinają się, Fałszywe w przeciwnym razie. [r]
Oto mała metoda, którą napisałem, aby to obliczyć.
private static int inclusiveDays(DateTime s1, DateTime e1, DateTime s2, DateTime e2)
{
// If they don't intersect return 0.
if (!(s1 <= e2 && e1 >= s2))
{
return 0;
}
// Take the highest start date and the lowest end date.
DateTime start = s1 > s2 ? s1 : s2;
DateTime end = e1 > e2 ? e2 : e1;
// Add one to the time range since its inclusive.
return (int)(end - start).TotalDays + 1;
}
Świetne, proste rozwiązanie. Działa dla mnie i przechodzi wszystkie moje testy. –
- 1. Liczba dni między dwoma instancjami czasu
- 2. Jak wybierać dane między dwoma zakresami dat w Androidzie SQLite
- 3. Skalowanie między dwoma zakresami numerów
- 4. Liczba dni między dwoma polami datepicker jquery z dostosowanymi ustawieniami
- 5. Oblicz położenie i liczbę przecięć między wieloma zakresami dat/godzin?
- 6. Liczba dni między datą bieżącą a datą
- 7. Liczba dni pomiędzy dwiema datami
- 8. Zaznaczanie przecinającego się obszaru między dwoma okręgami na płótnie
- 9. Obrys rysunku przecinających się okręgów
- 10. Panda liczba dni roboczych między DatetimeIndex a datownikiem
- 11. Jak uzyskać liczbę dni między dwoma datami celu-c
- 12. Uzyskaj liczbę dni między dwoma różnymi obiektami DateTime
- 13. Usuwanie plików starszych niż pewna liczba dni
- 14. Swift: Drukowanie wszystkich dat pomiędzy dwoma NSDate()
- 15. znajdź dane między zakresami w matlab
- 16. Pisanie funkcji w języku SQL w celu przechodzenia między zakresami dat w UDF
- 17. Dodaj dni do dat w ramce danych
- 18. Liczba meczów pomiędzy dwoma strunami
- 19. Łączenie przecinających się stron CGPath na iOS
- 20. Szybszy sposób na sprawdzenie przecinających się prostokątów?
- 21. Zakres dat kodu JavaScript między zakresem dat
- 22. Joda-Time Liczba dni od Epoki
- 23. Odejmowanie dwóch dat
- 24. Powłoka Bash Aktualna data Minus Liczba dni
- 25. Tworzenie wektora wszystkich dni między dwiema datami
- 26. Java, obliczyć liczbę dni między dwiema datami
- 27. Sprawdź, czy data przypada między 2 dat
- 28. Połączenie między dwoma użytkownikami
- 29. Wykrywanie promieni przecinających ikonkę
- 30. przecinających Mongoid „w” -Queries
Dziękuję wszystkim za komentarze ... Wspaniałe sugestie! Nie zdawałem sobie sprawy, że to takie proste. – BoredOfBinary