2010-03-03 4 views
2

J'ai actuellement une date dans ce formatUne autre question dateTime

2010-03-03 10:39:18 

qui est un champ TIMESTAMP dans MySQL. Je dois avoir la date dans ce format pour un moteur de recherche appelé Solr:

1995-12-31T23:59:59Z 

Voici un texte de leur site sur les dates:

Solr attend aux dates UTC lors de l'indexation . Le format de ce champ de date est de la forme 1995-12-31T23: 59: 59Z, et est plus forme restreinte de la représentation canonique de dateTime http://www.w3.org/TR/xmlschema-2/#dateTime. Le "Z" final indique l'heure UTC et est obligatoire. Les fractions secondes facultatives sont autorisées: 1995-12-31T23: 59: 59.999Z Tous les autres composants sont obligatoires.

J'ai reçu ce code d'un autre Q ici sur SO, mais cela ne fonctionne pas. Solr se plaint d'une « chaîne de temps non valide »:

$solr_date = date('c', (strtotime($date_from_mysql)); // doesn't work 

Quand écho $solr_date, le Z arrière mentionné ci-dessus n'est pas là. Merci.

+0

Vous recherchez une solution java ou php? –

+0

@Bhushan: PHP, à partir de ce que l'exemple de code ressemble. – Tomalak

+0

@pesar: avez-vous essayé d'utiliser l'une des bibliothèques PHP pour interagir avec Solr? http://code.google.com/p/solr-php-client/ http://pecl.php.net/package/solr http://code.google.com/p/solphr/ –

Répondre

-1

Ici, il est la solution PHP:

Divisez votre (2010-03-03 10:39:18) chaîne de date sur la base des arguments de la fonction mktime.

$solr_date = date('c', mktime($year,$month,$date, $h, $m , $s)); # it will work

+0

La signature de ' mktime() 'est' mktime (heure, minute, seconde, mois, jour, année) '... – jensgram

+0

Très probablement * ne fonctionnera pas. 'date ('c', ...)' formate une date locale avec le fuseau horaire suivant '+00: 00', et Solr attend l'heure UTC avec un' Z' final. – Tomalak

2

Tout d'abord, il est intéressant de noter que les colonnes de date/heure dans MySQL ne sont pas stockés dans un format de chaîne spécifique. Ils sont convertis en chaînes lors de leur impression et vous pouvez choisir comment les formater.

Si vous voulez une solution MySQL pure, les fonctions qui correspondent à votre problème sont CONVERT_TZ() pour obtenir l'heure UTC et DATE_FORMAT() pour l'afficher si nécessaire. .: par exemple

SELECT CURRENT_TIMESTAMP, 
    CONVERT_TZ(CURRENT_TIMESTAMP, '+01:00', '+00:00'), 
    DATE_FORMAT(CONVERT_TZ(CURRENT_TIMESTAMP, '+01:00', '+00:00'), '%Y-%m-%dT%H:%i:%sZ') 

Le problème est essentiellement que vous devez connaître votre fuseau horaire à l'avance car les colonnes TIMESTAMP ne permettent pas de stocker ces informations. En outre, vous pouvez trouver des problèmes avec l'heure d'été.

A propos de PHP, la fonction date() permet de combiner le code de format, vous n'êtes pas limité à un seul:

<?php 
$ts = strtotime($date_from_mysql); 
$solr_date date('Y-m-d', $ts) . 'T' . date('H:i:s', $ts) . 'Z'; 
?> 
5

Pourquoi vous convertir tout simplement pas à UTC?

$datetime = "2010-01-19 00:00:00"; 
    echo "Datetime Before: ".$datetime."<br />"; 
    $dttostr = strtotime("2010-01-19 00:00:00"); 
    echo "Datetime After: ".formatToUTC($dttostr)."<br />"; 
    echo "System Timezone: ".date_default_timezone_get()."<br />"; 

    function formatToUTC($passeddt) { 
     // Get the default timezone 
     $default_tz = date_default_timezone_get(); 

     // Set timezone to UTC 
     date_default_timezone_set("UTC"); 

     // convert datetime into UTC 
     $utc_format = date("Y-m-d\TG:i:s\Z", $passeddt); 

     // Might not need to set back to the default but did just in case 
     date_default_timezone_set($default_tz); 

     return $utc_format; 
    } 
+0

Merci! Cela m'a beaucoup aidé. J'ai passé tant d'heures à chercher une solution! –

+0

Pas de problème, assurez-vous de voter si vous aimez la réponse –

+3

Selon la spécification ISO 8601, vous devez avoir des zéros de tête sur tous les champs. Vous les avez tous à l'exception du champ des heures. Le 'G' devrait être un 'H' -> Y-m-d \ TH: i: s \ Z – easement

0

Ceci est un peu un hack, mais ça marche pour moi:

$to = date('c', strtotime($to)).'.000Z'; 
0

est ici encore une autre alternative:

$datetime = new DateTime('2010-01-19 00:00:00'); 
echo str_replace('+00:00', 'Z', $datetime->format('c')); 

See it in action

2

il suffit d'utiliser

gmdate('Y-m-d\TH:i:s\Z', $time);