Question

Pour ceux d'entre nous qui utilisent la norme les forfaits d'hébergement partagé, tels que GoDaddy ou des Solutions de Réseau, comment gérez-vous datetime conversions lorsque votre serveur d'hébergement (PHP) et le serveur MySQL sont dans des fuseaux horaires différents?

Aussi, quelqu'un at-il quelques conseils pour déterminer votre fuseau horaire, un visiteur de votre site est en et la manipulation d'une variable datetime de manière appropriée?

Était-ce utile?

La solution

Depuis PHP 5.1.0, vous pouvez utiliser date_default_timezone_set() fonction pour définir le fuseau horaire par défaut utilisé par tous de la date/heure de fonctions dans un script.

Pour MySql (cité de Serveur MySQL En Charge Des Fuseaux Horaires page)

Avant MySQL 4.1.3, le serveur ne fonctionne que dans le fuseau horaire du système défini au démarrage.Début avec MySQL 4.1.3, le serveur gère plusieurs paramètres de fuseau horaire, dont certains peuvent être modifiées lors de l'exécution.

De l'intérêt pour vous est par connexion réglage des fuseaux horaires, ce qui vous permettrait d'utiliser au début de vos scripts

SET timezone = 'Europe/London';

Comme pour la détection de la client le fuseau horaire, vous pouvez utiliser un peu de JavaScript pour obtenir et enregistrer les informations d'un cookie, et l'utiliser sur d'autres lectures de page, pour calculer le fuseau horaire approprié.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset);

Ou vous pourriez offrir aux utilisateurs la chioce pour définir leur temps les zones d'eux-mêmes.

Autres conseils

Stocker tout ce que l'UTC.Vous pouvez faire les conversions au niveau du client ou du côté serveur à l'aide des paramètres du client.

php - date

mysql - utc-timestamp

RE la réponse de Željko Živković, fuseau horaire descripteurs comme "Europe/London" ne fonctionne que si l'admin mySQL a ajouté le fuseau horaire tables pour le système, et en assure la mise à jour.

Sinon, vous êtes limité à sorties numériques comme '-4:00'.Heureusement, le php date('P') format (comme des 5.1.3)

Donc en dire un app fichier de configuration que vous pourriez avoir

define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
    date_default_timezone_set(TZ);
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}

Cela signifie que PHP et mySQL sera d'accord sur ce fuseau horaire à utiliser.

Toujours utiliser le TIMESTAMP pour le stockage des valeurs de temps.La colonne est stockée comme UNIX_TIME (de l'époque), mais implicitement converti à partir du cours time_zone décalage lors de l'écrit, et à l'arrière lors de la lecture.

Si vous voulez afficher la fois pour les utilisateurs dans d'autres fuseaux horaires, puis au lieu d'un mondial define(), définir le fuseau horaire dans le ci-dessus.Des valeurs d'HORODATAGE sera converti automatiquement par mySQL par le temps de votre application voit le résultat (qui peut parfois être un problème, si vous avez besoin de savoir réellement l'origine du fuseau horaire de l'événement trop alors il doit être dans une autre colonne)

et comme, "pourquoi ne pas simplement de stocker toutes les fois que int", qui ne vous perdre la possibilité de comparer et de valider les dates, et signifie que vous toujours pour les convertir à la date de la représentation au niveau application (et c'est dur pour les yeux lorsque vous regardez les données directement - rapide, ce qui s'est passé à 1254369600?)

Je sauvegarder tous mes dates de valeur bigint en raison d'avoir eu des problèmes avec le type dateTime avant.J'ai enregistrer le résultat de l'heure() de PHP de la fonction en elle, maintenant ils comptent comme étant dans le même fuseau horaire :)

En php réglage du fuseau horaire par du php.fichier ini: ini_set("date.timezone", "America/Los_Angeles");

ou en page particulière, vous pouvez faire comme: date_default_timezone_set("America/Los_Angeles");

Dans mysql, vous pouvez faire comme: SET GLOBAL time_zone = 'America/Los_Angeles';

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top