Calculer la date dil y a 1125 jours sur les systèmes non GNU?

Sur la ligne de commande Unix Bash, je veux calculer la date dil y a 1125 jours en utilisant le système dexploitation de base (par exemple No Perl ou Python).

Sur les systèmes exécutant GNU Date , je peux faire quelque chose comme ceci:

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

Les systèmes FreeBSD ou MacOSX ne sont pas livrés avec GNU Date, et ne prennent pas en charge les valeurs telles que « il y a X jours ».

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

I peut calculer une date dil y a quelques jours sur un système Mac ou FreeBSD, mais cela est limité à quelques jours:

# 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 

Puis-je calculer les anciennes dates sur des systèmes non GNU sans se plonger dans des outils comme Perl ou Python? Ou dois-je utiliser un langage de script plus puissant?

Réponse

Eh bien, vous pouvez faire quelque chose de sournois comme:

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

Testé sur OpenBSD (certainement pas de date basée sur gnu), et semble fonctionner.

Décomposition en étapes:

  • obtenir lheure unix actuelle (secondes depuis le début de lépoque unix):
 $ date +%s 1291679934 
  • obtenir le nombre de secondes en 1125 jours
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • soustraire lun de lautre (1291679934 – 97200000) = 1194478815

  • utiliser le nouveau unixtime (1194478815) pour imprimer une jolie date

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Comme alternative, sur solaris vous pouvez le faire pour imprimer la date *:

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

* référencé à partir de http://www.sun.com/bigadmin/shellme/

De plus, une alternative sur Solaris pour obtenir lhorodatage actuel à partir de la commande de date ** est:

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

** référencé à partir de http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Commentaires

  • Notez que %s et date -r sont des BSDism (depuis les tout premiers jours, donc ils ‘ re sur toutes les plates-formes BSD). Ne vous attendez pas ‘ à les voir sur les plates-formes System V (par exemple, Solaris na ni lun ni lautre).
  • Ah, Solaris, comme je taime … (;
  • @Gilles: Êtes-vous sûr? Solaris possède une multitude de répertoires bin, tels que / usr / ucb / bin, qui contiennent des versions dautres variantes dUnix. SunOS 4.X était basé sur BSD après tout.
  • Cela échoue lorsque lun des jours intermédiaires a plus ou moins de 60 * 60 * 24 secondes, comme des secondes intercalaires et des changements de calendrier.
  • @Sparr: Bon point. Un coffre-fort Lapproche consiste à soustraire lheure actuelle de la date absolue actuelle et à ajouter 12 * 60 * 60. Cela renvoie une heure comprise entre 10 h 59 et 13 h 01. Ajouter des périodes de 24 heures à cela et obtenir le la date correspondante est sûre.

Réponse

La réponse précédente était beaucoup trop compliquée. FreeBSD / macOS a le -v indicateur pour date, à partir de la page MAN (description abrégée):

Ajuster (cest-à-dire prendre la date actuelle et afficher le résultat de lajustement; pas réellement régler la date) la seconde, la minute, lheure, le mois, le jour, la semaine, le mois ou lannée selon val. Si val est précédé dun signe plus ou moins, la date est ajustée en avant ou en arrière en fonction de la chaîne restante, sinon la partie pertinente de la date est définie. La date peut être ajustée autant de fois que nécessaire à laide de ces indicateurs. Les drapeaux sont traités dans lordre indiqué.

Donc, pour vos besoins, date -v1125d fera simplement ce dont vous avez besoin

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

Réponse

Javais un problème similaire jai trouvé le dateutils pkg pour OpenBSD 6.4. Cétait un simple dateutils pkg_add pour moi.

#!/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 

Ma sortie ici est

#2018.11 

UPDATE 1

Jexécute cette commande le 10/12/2018

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

Résultat

 2015.11 

Il prend en charge les ajouts ou soustractions de temps que je peux dire. Voici les commandes qui aident à imprimer. #dadd -h (il ne sagit pas de lintégralité de limpression. Il y a plus dinformations sur les options.

 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 

Voici les commandes.

Voici les options de formatage.

Commentaires

  • (1) Il est ‘ que ce programme prend en charge -1mo. Pouvez-vous démontrer quil permet à lutilisateur de calculer la date dil y a 1125 jours, comme la question le demande? (2) La question dit  » en utilisant la base système dexploitation (par exemple, pas de Perl ou Python).  » Cela semblerait empêcher lajout dun nouveau paquet.
  • @ G-Man Merci pour le commentaire. Je suis nouveau pour contribuer sur StackExchange. Merci pour laide. Voir UPDATE 1

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *