Was ist eine clevere Methode, um die Anzahl der Tage seit X zu zählen?

11

Ich habe seit dem 17. November 2014 an meiner jetzigen Position angefangen zu arbeiten. Ich würde gerne wissen, wie viele Tage bis jetzt vergangen sind. Irgendwelche Ideen, wie man mit Linux eine einfache und nette Lösung findet?

ychaouche
quelle
Am Ende habe ich etwas Ähnliches in einem Perl-Skript gemacht. Ich habe die Funktion timelocal () verwendet, um die Anzahl der Sekunden von der Epoche bis zum angegebenen Datum (z. B. 17. November 2014) zu ermitteln, und diese dann vom aktuellen Epochendatum in Sekunden abgezogen und dann durch 86400 (Sekunden in) geteilt ein Tag). Ich bin sicher, jemand wird mit einer Nur-Shell-Lösung durchkommen :)
Jeff Schaller
2
Zeitarithmetik hat viele fummelige Sonderfälle. Während einfache Dinge wie das Subtrahieren von UNIX-Zeitstempeln und das Teilen durch 86.400 eine ungefähre Antwort liefern, ist es besser, eine spezielle Zeitbibliothek zu verwenden, die die Sonderfälle berücksichtigt, beispielsweise Pythons dateutil.
Reid
1
Einige der Antworten unter Schnell berechnen von Datumsunterschieden können auch hier hilfreich sein.
Manatwork
@ msh210 Sie sind lebenslang gesperrt und für 1 Monat zu Gefängnis verurteilt, während Sie der Community als Code-Reiniger für alten COBOL-Code dienen.
Ychaouche

Antworten:

14
echo $(( (`date +%s` - `date +%s -d '2014/11/17'`) / 86400 )) days ago
wurtel
quelle
4
Dies macht Schaltsekunden falsch. Ich meine, das ist jetzt kaum noch wichtig , aber in ungefähr 10.000 Jahren könnte der akkumulierte Fehler ausreichen, um eine Rolle zu spielen.
Kevin
2
Die Wahrscheinlichkeitssprungsekunden lösen einen Fehler in etwa 0,000001% aus. Dies ist vernachlässigbar im Vergleich zu der falschen Anzahl von Tagen, die diese Methode bei
Orten angibt, an
2
@ Kevin: Wenn er wissen will, wie viele Tage er irgendwo gearbeitet hat, können wir uns (bis zum weiteren Fortschritt in der Kryogenisierung oder Medizin) nicht allzu sehr darum kümmern ^^
Olivier Dulac
1
@jlliagre:% s ist die Unix-Zeit, die immer UTC ist, ohne Sommerzeit.
Kevin
1
Wahrscheinlich wundert er sich über die Anzahl der Tage, die er im Leerlauf hinter seinem Schreibtisch bei der Arbeit beschäftigt. Da dies wahrscheinlich nicht gegen Mitternacht ist, sondern irgendwo zwischen 8 und 17 Uhr (und date -d 2014/11/17ein Zeitstempel von Mitternacht, da keine Zeit angegeben ist), spielt die Sommerzeit keine Rolle.
wurtel
5

Nun, auf den ersten Blick:

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

In einem Skript (nicht sehr effizient, aber ... vielleicht handhabt es Schaltsekunden ?;))

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"
Frostschutz
quelle
Auch agowird verstanden:date --date="239 days ago"
Digital Trauma
1
@ DigitalTrauma schade, dass es nicht lokalisiert ist. ZB LC_ALL=ru_RU.utf8 date --date="239 дней назад"gibt mir das gleiche Ergebnis wie date --date="239".
Ruslan
@ Ruslan in der Tat :)
Digital Trauma
1

Ich habe Python in der Kommandozeile ausprobiert.

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

Sie können die awk Velour-Bibliothek verwenden :

$ velour -n 'print t_secday(t_now() - t_utc(2014, 9, 8))'
1385.54

Oder:

$ velour -n 'print t_secday(t_now() - t_utc(ARGV[1], ARGV[2], ARGV[3]))' 2014 9 8
1385.54
Steven Penny
quelle