Il y a quelques années, je suis tombé sur ce fichier sur notre serveur de fichiers.
Et je me demande comment un fichier peut dire qu'il a été créé en 1641? Autant que je sache, le temps passé sur pc est défini par le nombre de secondes écoulées depuis le 1er janvier 1970. Si cet index vous échappe, vous pouvez obtenir le 31 décembre 1969 (l'indice indique probablement -1), mais je suis perplexe à ce sujet. date apparemment aléatoire, même avant la fondation des États-Unis d’Amérique.
Alors, comment un fichier pourrait-il être daté de 1641?
PS: les dates sont en français. Février est février.
filesystems
Fredy31
la source
la source
clock_gettime(2)
page de manuel pour obtenir une définition destruct timespec
ce qui est cestat
que d'autres appels système utilisent pour transmettre les horodatages entre l'espace utilisateur et le noyau. C'est une structure avec untime_t
en secondes et unelong tv_nsec
nanosecondes. Sur les systèmes 64 bits, les deux sont en 64 bits, donc l'horodatage total est de 128 bits (16 octets). (Désolé pour trop de détails, je me suis emporté.)Réponses:
Pourquoi une date des années 1600 est-elle possible?
Windows ne stocke pas les horodatages de modification de fichiers, contrairement aux systèmes Unix . Selon le centre de développement Windows (emphase moi):
Donc, en définissant une mauvaise valeur ici, vous pouvez facilement obtenir les dates des années 1600.
Bien sûr, une autre question importante est: comment cette valeur a-t-elle été définie? Quelle est la date actuelle? Je pense que vous ne pourrez jamais le savoir, car cela aurait pu être simplement une erreur de calcul dans le pilote du système de fichiers. Une autre réponse suppose que la date est en réalité un horodatage Unix interprété comme un horodatage Windows, mais qu’il est en fait calculé à des intervalles différents (secondes par rapport aux nanosecondes).
Comment cela est-il lié au problème de l'année 2038?
L'utilisation d'un type de données 64 bits signifie que Windows (en général) n'est pas concerné par le problème de l' an 2038, car les systèmes Unix traditionnels ont déjà utilisé un entier 32 bits, qui déborde plus tôt que l'entier 64 bits défini par Windows. a. (Ceci malgré le système Unix fonctionnant sur secondes et Windows fonctionnant sur micro / nanosecondes.)
Windows est toujours concerné par les programmes 32 bits compilés avec les anciennes versions de Visual Studio, bien sûr.
Les systèmes d'exploitation Unix plus récents ont déjà étendu le type de données à 64 bits, évitant ainsi le problème. (En fait, étant donné que les horodatages Unix fonctionnent en quelques secondes, la nouvelle date enveloppante sera dans 292 milliards d’années.)
Quelle est la date maximum pouvant être définie?
Pour les curieux, voici comment calculer cela:
@corsiKa
explique comment soustraire des années bissextiles: 29247/365/4 20Certaines personnes ont en fait essayé de définir cela et ont présenté la même année.
la source
time_t
s’agit d’un type 64time_t
bits. tronquerait les horodatages ... Quoi qu'il en soit, si quelqu'un était curieux de connaître l'état du problème, il est en grande partie résolu, à l'exception de l'ancienne version 32 bits. IDK si ARM 32 bits sera toujours pertinent en 2038, mais cela obligera au moins un changement ABI. Le x86 32 bits est quasiment disparu dans le monde Unix; ce n'est que Windows où le code 32 bits est encore courant.Si vous ne vous sentez pas trop mal à propos de certaines suppositions, laissez-moi vous expliquer. Et je ne veux pas dire "quelqu'un définit la valeur comme un non-sens", c'est évidemment toujours possible :)
Le temps Unix utilise généralement le nombre de secondes depuis 1970. Windows, en revanche, utilise 1601 comme année de début. Donc, si nous supposons (et c'est une grosse hypothèse!) Que le problème est une conversion erronée entre les deux temps, nous pouvons imaginer que la date qui était censée être représentée est en fait
en 2011 (1970 + 41), qui a été mal convertie à 1640 (1601 + 41). EDIT: En fait, j'ai commis une erreur lors de la première année Windows. Il est possible que la création ait eu lieu en 2010 ou qu'il y ait eu une autre erreur (les erreurs off-by-one sont assez courantes dans les logiciels: D).Étant donné que cette année est une autre des dates de suivi associées au fichier en question, je pense que c'est une explication assez plausible :)
la source
Comme cela a été écrit par d’autres, l’époque Windows est le 1601-01-01 00:00 .
Le nombre de secondes entre cette époque et l’heure du fichier affiché est 1.266.705.294 .
Si nous ajoutons cela à l'époque Unix, nous arrivons au 2010-02-20 23:34:54 CEST , un samedi. C'est environ un an avant la dernière date d'accès, ce qui le rend un peu plausible. Il s’agissait donc peut-être d’un horodatage Unix interprété contre la mauvaise époque.
la source
Comme d'habitude pour ce genre de questions, le blog de Raymond Chen a une réponse à ce sujet dans "Pourquoi l'époque Win32 du 1er janvier 1601?" entrée du 6 mars 2009:
la source