10
votes

Utiliser Strtotime pour les dates avant 1970

J'ai une colonne de texte dans MySQL et stocke une valeur de date dans le format AAAA-MM-DD. Maintenant, dans ma page PHP, j'utilise ce code pour analyser une valeur de date. XXX

MAINTENANT, je viens de lire que Strtotime () analyse des valeurs uniquement après le 1er janvier 1970. J'ai beaucoup des valeurs de date avant cette date. Y at-il un travail autour? Je ne veux pas changer ma structure de base de données.


0 commentaires

7 Réponses :


1
votes

Vous devez utiliser une date columnn, pas du texte.
et date_format () fonction SQL pour formater la date dans la requête


4 commentaires

Je ne peux pas changer le type de colonne. J'ai plusieurs valeurs dans une colonne de texte et certaines d'entre elles sont des dates (dans le format AAAA-MM-DD). Il existe également une autre colonne qui spécifie si la ligne contient une valeur de date ou une valeur de texte.


Dans ce cas, vous devez redéfinir votre base de données.


Êtes-vous en train de dire qu'il n'y a pas de travail à ce problème, sans repenser la base de données? Je veux juste convertir un texte de format AAAAYY-MM-DD en format de date F J, Y. EG: 1820-05-20 au 20 mai 1820.


Il n'y a pas de problème du tout pour la date. Et la solution que j'avais écrite. Bot pour l'ensemble Votre base de données, vous l'avez déjà ruinée, si vous avez des données de différentes sortes dans une colonne. Il n'y a pas de solution et cela vous mènera directement à la catastrophe



13
votes

à partir du documentation pour strtotime () :

strtotime () a une limite de gamme entre le vendredi 13 déc. 1901 20:45:54 GMT et TUE, 19 janvier 2038 03:14:07 GMT; Bien qu'avant PHP 5.1.0, cette plage a été limitée de 01-01-1970 au 19-01-2038 sur certains systèmes d'exploitation (Windows).

Quelle version de PHP fonctionnez-vous? Et sur quelle plate-forme? Peut-être qu'il est temps d'une mise à niveau.

Si vous travaillez avec des dates situées à l'extérieur du 13 déc. 1901 à 19 janvier 2038, envisagez d'utiliser des objets DateTime de PHP pouvant fonctionner avec une gamme de dates beaucoup plus larges. < / p>

procédural: xxx

oop: xxx


4 commentaires

Merci - J'utilise le moteur de recherche Solr Apache, l'utilisation de la fonction MySQL Date_Format n'est pas une option car toutes les dates doivent être indexées dans le format AAAA-MM-DDTHH-MM-SSZ. Cela doit ensuite être analysé à l'aide de PHP (j'utilise l'API PHP pour récupérer les résultats de la recherche), DateTime était le ticket. EDIT: Cela pourrait être une réponse pour les autres rencontres dans ce numéro avec Apache Solr: wiki.apache.org / Solr / DataimportHandler # DateFormatTransformer


@Mark: J'ai PHP5.2.6, Strtotime apparaît toujours en blanc de date avant 1970. Où avez-vous vu "avant 5.1.0 ..."


@Scottchu - un horodatage est un entier signé; Les valeurs négatives sont utilisées pendant quelques secondes avant 1970-01-01 00:00:00 GMT et ont été sur toutes les plateformes depuis 5,1.0 ..... Référence à cela se trouve dans la section Notes sur le Docs page (Note 2)


@Mark: merci! Je viens de manquer la partie Notes.



1
votes
function safe_strtotime($string)
{
    if(!preg_match("/\d{4}/", $string, $match)) return null; //year must be in YYYY form
    $year = intval($match[0]);//converting the year to integer
    if($year >= 1970) return date("Y-m-d", strtotime($string));//the year is after 1970 - no problems even for Windows
    if(stristr(PHP_OS, "WIN") && !stristr(PHP_OS, "DARWIN")) //OS seems to be Windows, not Unix nor Mac
    {
        $diff = 1975 - $year;//calculating the difference between 1975 and the year
        $new_year = $year + $diff;//year + diff = new_year will be for sure > 1970
        $new_date = date("Y-m-d", strtotime(str_replace($year, $new_year, $string)));//replacing the year with the new_year, try strtotime, rendering the date
        return str_replace($new_year, $year, $new_date);//returning the date with the correct year
    }
    return date("Y-m-d", strtotime($string));//do normal strtotime
}

2 commentaires

StrtOTIME retourne un horodatage, votre fonction renvoie une date ISO 8601. C'est une différence extrêmement importante!


En effet tu as raison. Cependant, ce que @Ctroy demande est un moyen d'avoir une date ISO 8601, alors je suppose que mon imprécision pourrait être pardonnée!



0
votes

Je suis un noob et j'avais des problèmes similaires concernant l'utilisation de Strtime VS Explode. J'ai couru sur ce fil et a été grandement aidé par les commentaires sur le changement de date limite de la date de Mark Baker (merci!). J'ai donc écrit ce code juste pour jouer avec le concept. Peut-être que cela aidera d'autres noobs tels que moi-même.

Changez simplement la date sur la principale ligne PHP et voyez ce qui arrive aux dates ci-dessous - très intéressantes. Merci encore! P>

<?php $dob = "1890-11-11"; ?>
<html>
<head>
<style>

.inputdiv {
    width:200px;
    margin:100px auto 10px auto;
    background-color:#CCC2FC;
    text-align:center;
    border:1px solid transparent;}

.spacer{
    width:199px;
    margin:20px auto 20px auto;}    

</style>
</head>
<body>

<div class="inputdiv">
  <div class="spacer"><?php echo "Raw dob: ".$dob ?></div>
  <div class="spacer"><?php echo "Strtotime dob: ".date("m-d-Y", strtotime($dob)) ?></div>
  <div class="spacer"><?php list ($y, $m, $d) = explode('-', $dob);
                       $dob = sprintf("%02d-%02d-%04d", $m, $d, $y);
                       echo "Explode dob: ".$dob ?></div>
</div>
</body>
</html>


0 commentaires

1
votes
$date = DateTime::createFromFormat('d M Y','17 Jan 1900');
echo $date->format('Y-m-d');

0 commentaires

0
votes

Juste pour mettre à jour ceci pour les temps modernes, PHP7 Strtotime () sur un système 64 bits peut gérer pratiquement n'importe quelle date de la publicité, bien que, pour une raison quelconque, la page d'homme dit toujours 1970. XXX

Résultat : xxx

et xxx

résultat xxx


6 commentaires

Cela ne semble pas fonctionner pour moi bien que j'utilise PHP7.1.10 ou que vous disiez que cela modifiera toujours une date de 1970 à 1970?


Dans quel système d'exploitation êtes-vous? Est-ce un système d'exploitation 64 bits? Cela fonctionne sur Linux, FreeBSD et OSX. Strtotime () génère une date négative pour les dates avant 1970. Aller au-delà de 65 ans, vous avez besoin d'une version 64 bits.


Windows 10 64 bit, lorsque je copie votre code, il ne montre que "timbre:"


On dirait que strtotime retourne faux? Serions-nous surpris si Windows ait 5 ans de retard? Désolé mais je n'ai pas de php sur un système Windows, je ne peux donc pas le tester.


Trouvé ce Stackoverflow.com/a/10924871/4220457 pour être très utile car je ne peux pas comprendre pourquoi cela ne fonctionne pas


Peut-être que si vous êtes coincé sur Windows. Comme je l'ai souligné, cela fonctionne dans la plupart des implémentations modernes du système d'exploitation. Mes serveurs exécutent Apache sur UNIX, donc je n'ai pas besoin de solution de contournement de Windows. Il n'y a aucune raison que les horodatages devraient déborder à la limite 32 bits. À l'époque de Y2K, à peu près tout OSES était 32 bit, ce qui était un gros problème. Maintenant, ils ne sont pas, et je suis sûr que Microsoft rattrapera finalement. Dans un système d'exploitation 64 bits, Strtotime devra retourner une courte intensive, ce qui ne devrait pas. L'entier natif est de 64 bits sur un système 64 bits.



0
votes

J'ai une base de données SQL avec une base de données SQL lorsque chaque État des États-Unis a été fondée, revenant à 1787. Ce champ est défini la date dans la base de données, au format AAAA-MM-DD (ex. 1787-12-07). . J'ai essayé de nombreuses méthodes, mais les plus simples et efficaces que j'ai trouvées étaient: (le clip exact du code que j'utilise. Modifiez les informations et les variables dont vous avez besoin.)

    <?php    
    $page = 'geo-usa.php';
    $sort = 'stateName';
     if (isset($_GET['sortBy'])){
      $sortBy = $_GET['sortBy'];
       if($sortBy == 'stateEst'){
        $sort = 'stateEst'; }
       if($sortBy == 'capital'){
        $sort = 'stateCapital'; }      
       if($sortBy == 'capitalEst'){
        $sort = 'stateCapitalEst'; }     }    
    $con=mysqli_connect($servername, $hostname, $password, $database);
     if (mysqli_connect_errno()){ print "Failed to connect to MySQL: " . 
       mysqli_connect_error(); exit(); }
    $stateData = "SELECT * FROM state ORDER BY $sort ASC, stateEst ASC";
    $stateData2 = mysqli_query($con, $stateData);
     while($stateData3 = mysqli_fetch_array($stateData2, MYSQLI_ASSOC)){
      $stateID = $stateData3['stateID'];
      $stateName = $stateData3['stateName'];
      $stateAbr = $stateData3['stateAbr'];
      $stateEstYear = $stateData3['stateEstYear'];
      $stateEst = $stateData3['stateEst'];
      $stateCapital = $stateData3['stateCapital'];
      $stateCapitalEst = $stateData3['stateCapitalEst'];
      $stateMotto = $stateData3['stateMotto'];

    //Here is how you format a yyyy-mm--dd date within a database
      $stateEstDate = date_create($stateData3['stateEst']);
      $stateEstFormat = date_format($stateEstDate, "l F d, Y");
    /// <- remove comments -

      print "<table border='0' bordercolor='lime' cellpadding='1' 
            cellspacing='1' width='100%'>
         <tr>
           <td align='left' style='padding-top:10px;'>
             <a href='$page' style='font-size:14px; color:red; text- 
               decoration:none; padding-left:7px'>
             $stateName</a></td>
          </tr>
         <tr>
           <td align='left' style='padding-left:20px;'>
             <a href='$page?sortBy=stateEst' style='font-size:10px; 
               color:white; text-decoration:none;'>
             $stateEstFormat </a></td>
          </tr>
        </table>"; } ?>


2 commentaires

Merci pour la réponse, mais pourriez-vous supprimer tout le code de la chaudière qui n'est pas lié à la solution à la question? Par exemple, toute la partie HTML n'est pas pertinente pour la solution. Si la réponse est liée à la fonction dat_create de PHP, vous pouvez toujours ajouter un lien à la documentation de cette fonction ou expliquer pourquoi cela fonctionne (d'ailleurs, je ne sais pas si votre solution fonctionne, je n'ai pas fait 't check). Juste quelques suggestions pour rendre votre réponse plus utile;)


J'ajoute tout le clip du code pour lui donner le contexte. De plus, la date à laquelle je convertit est déclarée variable dans un délai de temps. Pour comprendre où est venu la date, j'ai montré la sélection de la base de données. Trop de réponses ici ne donnent pas l'arrière-plan à la façon dont ils ont eu sa solution. Je viens d'inclure le comment.