Berechnen Sie das Datum von vor 1125 Tagen auf Nicht-GNU-Systemen?

In der Unix Bash-Befehlszeile möchte ich das Datum von vor 1125 Tagen mit dem Basisbetriebssystem (z. B. No Perl oder Python) berechnen.

Auf Systemen, auf denen GNU Date ausgeführt wird, kann ich Folgendes tun:

ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007 

FreeBSD- oder MacOSX-Systeme werden nicht mit GNU-Datum ausgeliefert und unterstützen keine Werte wie „vor X Tagen“.

freebsd81 $ date --date="+1125 days ago" date: illegal option -- - 

I kann ein Datum von vor einigen Tagen auf einem Mac- oder FreeBSD-System berechnen, dies ist jedoch auf einige Tage beschränkt:

# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206 

Kann ich alte Daten auf Nicht-GNU-Systemen berechnen, ohne sich mit Tools wie Perl oder Python zu beschäftigen? Oder muss ich eine leistungsfähigere Skriptsprache verwenden?

Antwort

Nun, Sie können etwas hinterhältiges tun wie:

 $ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 

Getestet auf OpenBSD (definitiv nicht gnu-basiertes Datum) und scheint zu funktionieren.

Aufteilen in Schritte:

  • Ermittelt die aktuelle Unixtime (Sekunden seit Beginn der Unix-Epoche):
 $ date +%s 1291679934 
  • Ermittelt die Anzahl der Sekunden in 1125 Tage
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • subtrahieren voneinander (1291679934 – 97200000) = 1194478815

  • Verwenden Sie die neue Unixtime (1194478815), um ein hübsches Datum zu drucken.

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Alternativ auf Solaris Sie können dies tun, um das Datum * zu drucken:

    /bin/echo "0t1194478815>Y\n<Y=Y" |adb

* referenziert von http://www.sun.com/bigadmin/shellme/

Eine Alternative unter Solaris zum Abrufen des aktuellen Zeitstempels aus dem Datumsbefehl ** lautet:

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"

** referenziert von http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Kommentare

  • Beachten Sie, dass %s und date -r BSDismen sind (von Anfang an, also ‚ auf allen BSD-Plattformen). Erwarten Sie nicht, ‚ sie auf System V-Plattformen zu sehen (z. B. Solaris hat keine).
  • Ah, Solaris, wie ich dich liebe … (;
  • @Gilles: Sind Sie sicher? Solaris verfügt über eine Vielzahl von bin-Verzeichnissen wie / usr / ucb / bin, die Versionen aus anderen Unix-Varianten enthalten. SunOS 4.X war schließlich BSD-basiert.
  • Dies schlägt fehl, wenn einer der dazwischen liegenden Tage mehr oder weniger als 60 * 60 * 24 Sekunden hat, z. B. Schaltsekunden und Kalenderänderungen.
  • @Sparr: Guter Punkt. Ein Safe Der Ansatz besteht darin, die aktuelle Tageszeit vom aktuellen absoluten Datum zu subtrahieren und 12 * 60 * 60 zu addieren. Dies gibt eine Tageszeit zwischen 10:59 und 13:01 zurück. Fügen Sie dazu 24-Stunden-Zeiträume hinzu und erhalten Sie die Das entsprechende Datum ist sicher.

Antwort

Die vorherige Antwort war viel zu kompliziert. FreeBSD / macOS haben die -v -Flag für date von der MAN-Seite (abgekürzte Beschreibung):

Anpassen (d. h. das aktuelle Datum nehmen und das Ergebnis der Anpassung anzeigen; nicht wirklich das Datum einstellen) die Sekunde, Minute, Stunde, Monat Tag, Wochentag, Monat oder Jahr nach val. Wenn vor val ein Plus- oder Minuszeichen steht, wird das Datum entsprechend der verbleibenden Zeichenfolge vorwärts oder rückwärts angepasst, andernfalls wird der relevante Teil des Datums festgelegt. Mit diesen Flags kann das Datum beliebig oft angepasst werden. Flags werden in der angegebenen Reihenfolge verarbeitet.

Für Ihren Zweck erledigt date -v1125d einfach das, was Sie benötigen

$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT 

Antwort

Ich hatte ein ähnliches Problem, bei dem ich das dateutils pkg für OpenBSD 6.4. Es war ein einfaches pkg_add Datum für mich.

#!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth 

Meine Ausgabe hier ist

#2018.11 

UPDATE 1

Ich führe diesen Befehl am 2018.12.10

HostNameHere# dadd date -1125d -f "%Y.%m" 

Ergebnis

 2015.11 

Es unterstützt alle Zeitadditionen oder -subtraktionen, die ich erkennen kann. Hier finden Sie die Befehle zum Ausdrucken. #dadd -h (dies ist nicht die Gesamtheit des Ausdrucks. Es gibt weitere Informationen zu Optionen.

 Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30 

Hier sind die Befehle.

Hier sind die Formatierungsoptionen.

Kommentare

  • (1) ‚ ist schön, dass dieses Programm . Können Sie nachweisen, dass der Benutzer das Datum von vor 1125 Tagen berechnen kann, wie in der Frage angegeben? (2) In der Frage wird “ unter Verwendung der Basis angegeben Betriebssystem (zB No Perl oder Python). “ Dies scheint das Hinzufügen eines neuen Pakets auszuschließen.
  • @ G-Man Vielen Dank für den Kommentar. Ich bin neu in StackExchange. Danke für die Hilfe. Siehe UPDATE 1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.