Jaki jest sprytny sposób na policzenie liczby dni od X?


11

Pracę na obecnym stanowisku zacząłem od 17 listopada 2014 r. Chciałbym wiedzieć, ile dni mi do tej pory. Jakieś pomysły na wykorzystanie Linuksa do stworzenia prostego i przyjemnego rozwiązania?


Skończyło się na zrobieniu czegoś podobnego w skrypcie perla; Użyłem funkcji timelocal (), aby uzyskać liczbę sekund od epoki do podanej daty (na przykład 17 listopada 2014 r.), Następnie odjąłem ją od bieżącej epoki-daty-w sekundach, a następnie podzieliłem przez 86400 (sekund w dzień). Jestem pewien, że ktoś przyjdzie z rozwiązaniem opartym tylko na powłoce :)
Jeff Schaller

2
Arytmetyka czasu ma wiele dziwnych przypadków. Podczas gdy proste rzeczy, takie jak odejmowanie znaczników czasu UNIX i dzielenie przez 86 400 dają przybliżoną odpowiedź, lepiej jest użyć specjalistycznej biblioteki czasu, która uwzględnia przypadki szczególne, na przykład Pythona dateutil.
Reid

1
Niektóre odpowiedzi w Szybkim obliczaniu różnic dat mogą również tutaj pomóc.
manatwork


@ msh210 jesteś zbanowany na całe życie i skazany na 1 miesiąc więzienia, jednocześnie służąc społeczności jako narzędzie do czyszczenia kodu dla starożytnego kodu COBOL.
ychaouche

Odpowiedzi:


14
echo $(( (`date +%s` - `date +%s -d '2014/11/17'`) / 86400 )) days ago

4
To robi błędne sekundy przestępne. To znaczy, teraz nie ma to większego znaczenia , ale za około 10 000 lat skumulowany błąd może wystarczyć.
Kevin

2
Prawdopodobieństwo sekund przestępnych spowoduje błąd w około 0,000001%. Jest to nieistotne w porównaniu z niewłaściwą liczbą dni, jakie ta metoda da w lokalizacjach, w których obserwuje się czas letni: 2% przypadków ...
jlliagre

2
@Kevin: Jeśli chce wiedzieć, ile dni gdzieś pracował, możemy (aż do dalszego postępu w kriogenizacji lub medycynie) nie przejmować się tym zbytnio ^^
Olivier Dulac

1
@jlliagre:% s to czas uniksowy, który jest zawsze UTC, któremu brakuje czasu letniego.
Kevin,

1
Są szanse, że będzie się zastanawiał, ile dni spędził podczas pracy na biegu jałowym za biurkiem. Ponieważ prawdopodobnie nie jest to około północy, ale gdzieś między 8 rano a 5 po południu (i date -d 2014/11/17daje znacznik czasu północy, ponieważ nie ma tu czasu), czas letni nie ma znaczenia.
wurtel

5

Na pierwszy rzut oka:

$ date --date="-239 days"
Mon Nov 17 15:25:40 CET 2014

W skrypcie (niezbyt wydajny, ale ... może obsługuje sekundy przestępne?;))

i=0
result=""
while [ "$result" != "20141117" ]
do
    i=$((i+1))
    result=$(date --date="-$i days" +%Y%m%d)
done
echo "$i" days have passed since "$result"

Nawet agorozumie się:date --date="239 days ago"
Cyfrowa trauma

1
@DigitalTrauma szkoda, że ​​nie jest zlokalizowany. Np. LC_ALL=ru_RU.utf8 date --date="239 дней назад"Daje mi taki sam wynik jak date --date="239".
Ruslan

@Ruslan rzeczywiście :)
Cyfrowa trauma

1

Próbowałem Pythona w wierszu poleceń.

$ python -c "import datetime; print datetime.date.today() - datetime.date(2014,11,17)"
246 days, 0:00:00 

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.