Message d'erreur "date: date incorrecte" 2016-10-16 "

35

Aujourd'hui, mon horloge a été automatiquement ajustée à l'heure d'été et un script d'une crontab a commencé à échouer. J'ai jeté un œil à ce qui se passait et l'erreur suivante était affichée avec LC_ALL=C:

date: date invalide '2016-10-16'

Je pensais qu'il serait préférable de redémarrer le système, mais maintenant je l'ai redémarré et l'erreur persiste:

$ date -d '2016-10-15'
Sat Oct 15 00:00:00 BRT 2016
$ date -d '2016-10-16'
date: data inválida “2016-10-16”
$ date -d '2016-10-17'
Mon Oct 17 00:00:00 BRST 2016

Qu'est-ce qui peut causer cela?

Teresa e Junior
la source
De quel système d'exploitation exécutez-vous cette commande? Impossible de reproduire sur Debian 8. Essayé avec deux locales différents : sv_SE.utf8et en_us.utf-8.
Maulinglawns
2
À quelle heure du jour (nuit) le Brésil envoie-t-il les horloges à l'heure d'été?
Techraf
Je pensais à tous les pays où il était tardif, par exemple 2 heures du matin, où il était moins susceptible de poser problème.
njzk2

Réponses:

57

Le problème est que l'heure d'été a été modifiée et transmise 1 heure le 16 octobre 2016 dans votre fuseau horaire:

$ zdump -v America/Sao_Paulo | awk '/Oct 16/ && /2016/'
America/Sao_Paulo  Sun Oct 16 02:59:59 2016 UTC = Sat Oct 15 23:59:59 2016 BRT isdst=0
America/Sao_Paulo  Sun Oct 16 03:00:00 2016 UTC = Sun Oct 16 01:00:00 2016 BRST isdst=1

Donc , en tout temps entre 00:00à 00:59ce jour - là est considérée comme non valide dans votre fuseau horaire (mais peut - être valable dans d' autres):

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 0:59'
gdate: invalid date ‘2016-10-16 0:59’

$ TZ=Asia/Ho_Chi_Minh gdate -d '2016-10-16 0:59'
Sun Oct 16 00:59:00 ICT 2016

Vous pouvez définir du temps supplémentaire, qui ne se situe pas dans cette plage:

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 1:00'
Sun Oct 16 01:00:00 BRST 2016

Ce qui précède est le comportement de la date GNU.

La date BSD n'a pas ce problème. Si la date saisie est invalide dans le fuseau horaire, elle sera ajustée en mode silencieux 1 heure jusqu'à ce qu'elle atteigne une heure valide:

$ TZ=America/Sao_Paulo date -j -f '%Y%m%d%H%M' 201610160000
Sun Oct 16 01:00:53 BRST 2016
cuonglm
la source
1 heure et 53 secondes?!
dimanche
Donc, il a ajusté le temps de 53 secondes trop loin dans le futur? Ou ai-je mal compris quelque chose?
Domen
1
Aah, a du sens; préserve les données non spécifiées (par opposition à la suppression). Encore un peu étrange, il serait suffisant dans ce cas d'ajuster avant 00:59:07.
Domen
Continuons cette discussion sur le chat .
Domen