IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

date sur mac


Sujet :

Shell et commandes POSIX

  1. #1
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut date sur mac
    Bonsoir à tous et bonne année !!
    Je réalise actuellement une application dans laquelle je dois me servir de la commande "date"; je programme sous bash sur un Mac mais je teste
    des bouts de code sur une autre machine sous Linux.
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if [ $nbJours -ge $((10#$(date +%j -d "$annee-$mois-$jour"))) ] ; then ...
    Le but étant de comparer 2 dates.
    sous Linux pas de contestation mais sous OSX j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    date: illegal time format
    usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
                [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
    Renseignement prit, je ne vois pas le moyen d'afficher une date quelconque avec "date" sous OSX ?!

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Bonjour

    Effectivement, tu es perdu. Tu viens demander une commande Linux, sur le forum Unix, pour une utilisation sous MacOSX.

    Première remarque: Méfie-toi, l'Epoch sous Mac n'est pas le 1er janvier 1970 à minuit comme sous Unix/Linux. Cf Wikipedia.

    Deuxième remarque: L'option -d ne semble pas exister. Sous mac, il faut sûrement utiliser -v qui fait un ajustement, absolu ou relatif.
    Tu aurais pu trouver tout seul en tapant man date.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
         -v      Adjust (i.e., take the current date and display the result of the adjustment; not actually set
                 the date) the second, minute, hour, month day, week day, month or year according to val.  If
                 val is preceded with a plus or minus sign, the date is adjusted forwards or backwards according
                 to the remaining string, otherwise the relevant part of the date is set.  The date can be
                 adjusted as many times as required using these flags.  Flags are processed in the order given.
     
                 When setting values (rather than adjusting them), seconds are in the range 0-59, minutes are in
                 the range 0-59, hours are in the range 0-23, month days are in the range 1-31, week days are in
                 the range 0-6 (Sun-Sat), months are in the range 1-12 (Jan-Dec) and years are in the range
                 80-38 or 1980-2038.
     
                 If val is numeric, one of either y, m, w, d, H, M or S must be used to specify which part of
                 the date is to be adjusted.
     
                 The week day or month may be specified using a name rather than a number.  If a name is used
                 with the plus (or minus) sign, the date will be put forwards (or backwards) to the next (previ-ous) (previous)
                 ous) date that matches the given week day or month.  This will not adjust the date, if the
                 given week day or month is the same as the current one.
     
                 When a date is adjusted to a specific value or in units greater than hours, daylight savings
                 time considerations are ignored.  Adjustments in units of hours or less honor daylight saving
                 time.  So, assuming the current date is March 26, 0:30 and that the DST adjustment means that
                 the clock goes forward at 01:00 to 02:00, using -v +1H will adjust the date to March 26, 2:30.
                 Likewise, if the date is October 29, 0:30 and the DST adjustment means that the clock goes back
                 at 02:00 to 01:00, using -v +3H will be necessary to reach October 29, 2:30.
     
                 When the date is adjusted to a specific value that does not actually exist (for example March
                 26, 1:30 BST 2000 in the Europe/London timezone), the date will be silently adjusted forwards
                 in units of one hour until it reaches a valid time.  When the date is adjusted to a specific
                 value that occurs twice (for example October 29, 1:30 2000), the resulting timezone will be set
                 so that the date matches the earlier of the two times.
     
                 Adjusting the date by months is inherently ambiguous because a month is a unit of variable
                 length depending on the current date.  This kind of date adjustment is applied in the most
                 intuitive way.  First of all, date tries to preserve the day of the month.  If it is impossible
                 because the target month is shorter than the present one, the last day of the target month will
                 be the result.  For example, using -v +1m on May 31 will adjust the date to June 30, while
                 using the same option on January 30 will result in the date adjusted to the last day of Febru-ary. February.
                 ary.  This approach is also believed to make the most sense for shell scripting.  Nevertheless,
                 be aware that going forth and back by the same number of months may take you to a different
                 date.
     
                 Refer to the examples below for further details.
     
         An operand with a leading plus (`+') sign signals a user-defined format string which specifies the for-mat format
         mat in which to display the date and time.  The format string may contain any of the conversion speci-fications specifications
         fications described in the strftime(3) manual page, as well as any arbitrary text.  A newline (`\n')
         character is always output after the characters specified by the format string.  The format string for
         the default display is ``+%+''.
     
         If an operand does not have a leading plus sign, it is interpreted as a value for setting the system's
         notion of the current date and time.  The canonical representation for setting the date and time is:
     
               cc      Century (either 19 or 20) prepended to the abbreviated year.
               yy      Year in abbreviated form (e.g., 89 for 1989, 06 for 2006).
               mm      Numeric month, a number from 1 to 12.
               dd      Day, a number from 1 to 31.
               HH      Hour, a number from 0 to 23.
               MM      Minutes, a number from 0 to 59.
               ss      Seconds, a number from 0 to 61 (59 plus a maximum of two leap seconds).
     
         Everything but the minutes is optional.
     
         Time changes for Daylight Saving Time, standard time, leap seconds, and leap years are handled automat-ically. automatically.
         ically.
    Les plus parlants sont les exemples:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    EXAMPLES
     
         In the Europe/London timezone, the command:
     
               date -v1m -v+1y
     
         will display:
     
               Sun Jan  4 04:15:24 GMT 1998
     
         where it is currently Mon Aug  4 04:15:24 BST 1997.
     
         The command:
     
               date -v1d -v3m -v0y -v-1d
     
         will display the last day of February in the year 2000:
     
               Tue Feb 29 03:18:00 GMT 2000
     
         So will do the command:
     
               date -v30d -v3m -v0y -v-1m
     
         because there is no such date as the 30th of February.
     
         The command:
     
               date -v1d -v+1m -v-1d -v-fri
     
         will display the last Friday of the month:
     
               Fri Aug 29 04:31:11 BST 1997
     
         where it is currently Mon Aug  4 04:31:11 BST 1997.
    Tu vois ce qui te reste à faire.

    Bonne chance !
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Tu penses bien que "man date" je l'ai fait !
    Et j'ai découvert l'info pas trop claire ; c'est justement pour cette raison que j'ai posté !!
    Certe je suis loin de maîtriser l'anglais (comme toi) ,mais je ne vois pas mention d'affichage du jour de l'année ; car c'est cela que je veux :
    entrer une date quelconque de manière à ce que la fonction "date" me renvoie le JOUR DE L'ANNEE et pas autre chose.
    Est ce que quelqu'un sait faire cela ???

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Same player shoot again. Regarde les exemples ! C'est limpide.

    -v ajustement
    -v1d (d=day=jour) ajustement au jour 1
    -v3m (m=month=mois) ajustement au mois 3, soit mars
    -v0y (y=year=an) ajustement à l'année 0, soit 2000

    Il prend donc en compte la date du 1er mars 2000.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    c'est très bien tout ça ....
    Mais moi je veux par exemple : date -v5d -v2m [option machin chose] = 36

    C'est limpide ça !!!

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    +"%j"
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Effectivement, tu es perdu. Tu viens demander une commande Linux, sur le forum Unix, pour une utilisation sous MacOSX.
    Le forum Unix/POSIX pour un MacOS 10 qui est un Unix/POSIX, c'est pas délirant, même si là on utilise des extensions non standard et que le forum BSD est probablement plus approprié.

    Première remarque: Méfie-toi, l'Epoch sous Mac n'est pas le 1er janvier 1970 à minuit comme sous Unix/Linux. Cf Wikipedia.
    Non, pas sous bash où l'on est forcément dans l'environnement UNIX:

    Citation Envoyé par man time(3)
    The time() function returns the value of time in seconds since 0 hours, 0 minutes, 0 seconds, January
    1, 1970, Coordinated Universal Time, without including leap seconds. If an error occurs, time()
    returns the value (time_t)-1.

    A propos de la question initiale, dans la page de manuel de date pour MacOS 10, je lis quelque chose qui implique que la commande date de MacOS 10 permet d'interpréter une date quelconque, d'afficher l'epoch time correspondant et donc de pouvoir comparer deux dates facilement :

    Citation Envoyé par man date(1)
    Finally the command:

    date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

    can be used to parse the output from date and express it in Epoch time.
    Cela dit, j'ai du mal à voir comment la commande Linux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $nbJours -ge $((10#$(date +%j -d "$annee-$mois-$jour"))) ] ; then ...
    compare deux dates.
    ɹǝsn *sıɹɐlos*

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Je suis plus dans la modération mais, juste pour infos :

    Citation Envoyé par Flodelarab Voir le message
    Effectivement, tu es perdu. Tu viens demander une commande Linux, sur le forum Unix, pour une utilisation sous MacOSX.
    Le forum "Shell et commandes POSIX" est bien officiellement le bon endroit pour les questions sur la ligne de commande sur Mac :p
    Il y a d'ailleurs un tag [OS X] sur ce forum : https://www.developpez.net/forums/d1...i/#post7466232

    Et ça avait été choisit à l'époque parce que quelqu'un qui demande de l'aide sur du shell, à beaucoup plus de chance de trouver de l'aide pertinente ici que sur les autres forums systèmes fut-il sur mac (qui est par défaut POSIX comme les autres unix, bien que le shell par défaut soit une vielle version de bash => perso je recommande de migrer le tout (bash + coreutils + sed/awk) sur des versions récentes et GNU avec brew).

    Idriss

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    A propos de la question initiale, dans la page de manuel de date pour MacOS 10, je lis quelque chose qui implique que la commande date de MacOS 10 permet d'interpréter une date quelconque, d'afficher l'epoch time correspondant et donc de pouvoir comparer deux dates facilement :

    Citation Envoyé par Envoyé par man date(1)
    Finally the command:

    date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

    can be used to parse the output from date and express it in Epoch time.
    Attention! Pour le cas où quelqu'un sous macos, en environnement français, lirait ce forum et voudrait utiliser cette commande (sans trop réfléchir), il est préférable de prendre conscience que les exemples du man date sont en anglais (comme Sun Jan 4 04:15:24 GMT 1998) alors que l'affichage français est différent (comme Lun 26 mar 2018 09:56:48 CEST, par exemple).

    Si je ne m'abuse, ceci est dû à la présence de LANG=fr_FR.UTF-8 dans mon environnement.

    En conséquence de quoi, sous macos, en environnement français, la commande pour obtenir la conversion en temps epoch d'une date (telle qu'elle est affichée dans le format par défaut) est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ date -j -f "%a %d %b %Y %T %Z" "$(date)" "+%s"
    1522051008
    Cela dit, on peut aussi (et préférablement) écrire du code indépendant des réglages de l'environnement, comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ date -j -f "%a %d %b %Y %T %Z" "$(date "+%a %d %b %Y %T %Z")" "+%s"
    1522051008
    # ou bien:
    $ date -j -f "%a %d %b %Y %T %Z" "$(date "+%a %d %b %Y %T %Z")" "+%s"
    1522051008

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par exe2bin Voir le message
    c'est cela que je veux :
    entrer une date quelconque de manière à ce que la fonction "date" me renvoie le JOUR DE L'ANNEE et pas autre chose.
    Est ce que quelqu'un sait faire cela ???
    Citation Envoyé par Flodelarab Voir le message
    +"%j"
    À ta question (renvoyer le jour de l'année), Flodelarab a répondu (un peu laconiquement) date "+%j" qui, effectivement, renvoie bien le numéro de jour de l'année.

    Jusque là, tout va bien.

    Mais, dans ton premier message, tu as indiqué:
    Citation Envoyé par exe2bin Voir le message
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if [ $nbJours -ge $((10#$(date +%j -d "$annee-$mois-$jour"))) ] ; then ...
    Le but étant de comparer 2 dates.
    Donc, si j'ai bien compris, tu veux comparer 2 dates en utilisant une variable $nbJours, qui représente probablement un nombre de jours.

    Je tiens à attirer ton attention sur le fait que l'algorithme consistant à comparer les numéros de jour de 2 dates risque de donner un mauvais résultat autour du changement d'année!

    Par exemple, le numéro de jour du 31 décembre 2017 est 365 et le numéro de jour du 1er janvier 2018 est 1, ce qui fait que la comparaison de leurs numéros de jour indique qu'ils sont séparés de 364 jours, alors que ces dates sont réellement séparées d'1 jour, non?

    De même, pour le 26 mars 2017 et le 27 mars 2018, la comparaison des numéros de jour indique qu'ils sont séparés de 1 jour, alors qu'ils ont plus d'1 an d'écart.

    La méthode reposant sur une comparaison de temps epoch (décrite dans un post précédent) me paraît beaucoup plus fiable pour comparer 2 dates!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 17h55
  2. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 12h08
  3. [VB.NET] Pb avec date sur VB.Net
    Par mpascolo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/01/2005, 10h14
  4. [FLASH MX 2004] Ouvrir un document .fla sur Mac
    Par tahiti bob dans le forum Flash
    Réponses: 2
    Dernier message: 12/05/2004, 18h53
  5. [MX] autorun sur MAC
    Par tahiti bob dans le forum Flash
    Réponses: 10
    Dernier message: 07/02/2004, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo