Lasketaanko 1125 päivää sitten annettu päivämäärä muissa kuin GNU-järjestelmissä?

Unix Bash -komentorivillä haluan laskea päivämäärän 1125 päivää sitten peruskäyttöjärjestelmällä (esim. No Perl tai Python).

Järjestelmissä, joissa on GNU-päivämäärä , voin tehdä jotain tällaista:

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

FreeBSD- tai MacOSX-järjestelmät eivät toimita GNU-päivämäärän kanssa, eivätkä tue arvoja, kuten ”X päivää sitten”.

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

I osaa laskea muutaman päivän takaisen päivämäärän Mac- tai FreeBSD-järjestelmässä, mutta tämä on rajoitettu muutamaan päivään:

# 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 

Voinko laskea vanhat päivämäärät muissa kuin GNU-järjestelmissä käsittelemättä työkaluja kuten Perl tai Python Vai pitäisikö minun käyttää tehokkaampaa komentosarjakieliä?

Vastaa

No, voit tehdä jotain salaa, kuten:

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

Testattu OpenBSD: llä (ehdottomasti ei gnu-pohjainen päivämäärä) ja näyttää toimivan.

Jaottelu vaiheittain:

  • hanki nykyinen unixtime (sekuntia unix-aikakauden alusta):
 $ date +%s 1291679934 
  • saat sekuntien määrän 1125: ssä päivää
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • vähennä toinen toisesta (1291679934 – 97200000) = 1194478815

  • käytä uutta unixtime-ohjelmaa (1194478815) kauniin päivämäärän tulostamiseen

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Vaihtoehtoisesti solaris-sovelluksessa voit tehdä tämän tulostaaksesi päivämäärän *:

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

* viitattu kohteesta http://www.sun.com/bigadmin/shellme/

Solariksessa on myös vaihtoehto saada nykyinen aikaleima päivämääräkomennosta **:

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

** viitattu osoitteesta http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Kommentit

  • Huomaa, että %s ja date -r ovat BSD-ajatuksia (alusta alkaen, joten id = ”b8164dc8b7”>

uudelleen kaikilla BSD-alustoilla). Älä ’ aio nähdä heidän näkevänsä System V -alustoilla (esim. Solarisilla ei ole kumpaakaan).

  • Ah, Solaris, kuinka rakastan sinua … (;
  • @Gilles: Oletko varma? Solarisilla on useita roskakorihakemistoja, kuten / usr / ucb / bin, jotka sisältävät versioita muista unix-muunnelmista. SunOS 4.X oli loppujen lopuksi BSD-pohjainen.
  • Tämä epäonnistuu, kun jollakin välissä olevista päivistä on enemmän tai vähemmän kuin 60 * 60 * 24 sekuntia, kuten harposekunnit ja kalenterimuutokset.
  • @Sparr: Hyvä asia. lähestymistapa on vähentää nykyinen kellonaika nykyisestä absoluuttisesta päivämäärästä ja lisätä 12 * 60 * 60. Tämä palauttaa kellonajan välillä 10:59 ja 13:01. Lisäämällä tähän 24 tunnin jaksot ja saamalla vastaava päivämäärä on turvallinen.
  • Vastaus

    Edellinen vastaus oli aivan liian monimutkainen. FreeBSD / macOS: lla on -v lippu date, MAN -sivulta (lyhyt kuvaus):

    Säädä (eli ota nykyinen päivämäärä ja näytä säätö tulos; ei oikeastaan aseta päivämäärää) toinen, minuutti, tunti, kuukausi päivä, viikonpäivä, kuukausi tai vuosi val-arvon mukaan. Jos val-tunnuksen edessä on plus- tai miinusmerkki, päivämäärää muutetaan eteen- tai taaksepäin jäljellä olevan merkkijonon mukaan, muuten päivämäärän asianmukainen osa asetetaan. Päivämäärää voidaan säätää niin monta kertaa kuin tarvitaan näiden lippujen avulla. Liput käsitellään annetussa järjestyksessä.

    Joten date -v1125d tekee sinun tarkoituksellesi yksinkertaisesti mitä tarvitset

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

    vastaus

    Minulla oli samanlainen ongelma, löysin dateutils pkg OpenBSD 6.4: lle. Se oli yksinkertainen pkg_add dateutils minulle.

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

    Minun täälläni on

    #2018.11 

    UPDATE 1

    Suoritan tätä komentoa 2018.12.10

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

    Tulos

     2015.11 

    Se tukee kaikkia aikalisäyksiä tai vähennyksiä, jotka voin kertoa. Tässä on komentoja, jotka auttavat tulostamaan. #dadd -h (tämä ei ole tulosteen kokonaisuus. Asetuksista on lisätietoja.

     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 

    Tässä ovat komennot.

    Tässä ovat muotoiluvaihtoehdot.

    Kommentit

    • (1) On ’ mukavaa, että tämä ohjelma tukee -1mo. Voitteko osoittaa, että sen avulla käyttäjä voi laskea päivämäärän 1125 päivästä sitten, kun kysymys kysytään? (2) Kysymyksessä sanotaan ” pohjan avulla käyttöjärjestelmä (esim. No Perl tai Python). ” Se näyttäisi sulkevan pois uuden paketin lisäämisen.
    • @ G-Man Kiitos kommentista. Olen uusi osallistunut StackExchangeen. Kiitos avustasi. Katso päivitys 1

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *