2013-08-21 4 views
-1

J'essaye de créer une application simple qui permettra aux utilisateurs de rechercher deux emplacements et la différence de temps de deux emplacements leur sera montrée.différence de temps en PHP?

Je peux obtenir le décalage de deux emplacements en utilisant le code ci-dessous mais je ne peux pas le raccorder aux entrées de formulaire afin que les utilisateurs puissent choisir les emplacements!

Voici ce que je l'ai fait jusqu'à présent:

<form id="form1" name="form1" method="post" action="<?php $get_timezone_offset ?>"> 
    <label> 
    <input type="text" class="timezone1" id="timezone1" name="timezone1" id="timezone1" /> 
    <input type="text" class="timezone2" id="timezone2" name="timezone2" id="timezone2" /> 
    <input name="" type="button" value="submit" /> 
    </label> 
</form> 

    <?php 
    function get_timezone_offset($origin_tz, $remote_tz) { 
     $timezone1 = new DateTimeZone($origin_tz); 
     $timezone2 = new DateTimeZone($remote_tz); 

     $datetime1 = new DateTime("now", $timezone1); 
     $datetime2 = new DateTime("now", $timezone2); 

     $offset = $timezone1->getOffset($datetime1) - $timezone2->getOffset($datetime2); 
     return $offset; 
    } 

    $offset = get_timezone_offset('Europe/London', 'Asia/Shanghai'); 

    // convert offset to hours 
    echo $offset/3600; 
    ?> 

toute aide serait appréciée.

+0

Je ne suis pas sûr de comprendre le problème. Avez-vous de la difficulté à analyser l'entrée de formulaire et à l'alimenter à la fonction 'get_timezone_offset'? – Technoh

+0

Vous donnez explicitement des valeurs à votre fonction. Comme vous avez mis l'Europe contre l'Asie, vous recevrez -7. Si vous voulez mettre le formulaire dedans, vous devez passer $ _POST ['timezone1'] et 2 comme arguments –

+0

@Technoh, Oui c'est correct. En fait, ce que je veux faire est de supprimer les 'Europe/Londres', 'Asie/Shanghai' qui sont timezone1 et timezone2 et de laisser les utilisateurs rechercher l'emplacement en utilisant le formulaire fourni au format HTML. –

Répondre

0

essayer cette

**`Set the default timezone`** 

Vous pouvez définir votre fuseau horaire par défaut de deux façons: supposons "Europe/Paris" est le fuseau horaire que vous souhaitez définir:

Open your **`php.ini`** file in your favourite text editor and change the following line: **`date.timezone = Europe/Paris.`** You may have to restart your server in order to make this effective. 
In case you don't want to meddle with your ini file you can simply set the default time zone using the following PHP function: 

<?php date_default_timezone_set('Europe/Paris') ?> 

List of PHP supported Timezones Mise à jour vos fuseaux horaires

Votre installation php utilise le package timezonedb disponible sur PECL.

Vous pouvez vérifier la version actuelle de votre timezonedb avec:

<?php echo timezone_version_get() ?> 

Vous verrez un numéro comme celui-ci 2012,9 Wich correspondent à une date. Parfois, les fuseaux horaires sont mis à jour, si le paquet a plus d'un an, je vous suggère de mettre à jour votre timezonedb. Vous pouvez installer/mettre à jour votre version timezonedb en exécutant la commande suivante dans le terminal:

**$ sudo pecl install timezonedb** 

Ne pas oublier d'ajouter la nouvelle extension php.ini et redémarrez votre serveur afin de rendre cette efficacité.

extension=timezonedb.so * Get the User Timezone * Laissez l'utilisateur choisir ce

Avec la fonction ci-dessus, vous avez tous les fuseaux horaires répertoriés par continents. Vous pouvez ensuite créer un menu déroulant pour les continents et une option pour chaque pays.

<?php 

function timezone_options() 
{ 
    $zones = array(
     'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 
     'Atlantatic', 'Australia', 'Europe', 'Indian', 'Pacific' 
    ); 

    $list = timezone_identifiers_list(); 
    foreach ($list as $zone) { 
     list($zone, $country) = explode('/', $zone); 
     if (in_array($zone, $zones) && isset($country) != '') { 
      $countryStr = str_replace('_', ' ', $country); 
      $locations[$zone][$zone.'/'.$country] = $countryStr; 
     } 
    } 

    return $locations; 
} 

Get it via Javascript and PHP

Time zone are written as offset from UTC in the format **±[hh]:[mm], ±[hh][mm], or ±[hh].** So if the time being described is one hour ahead of UTC (such as the time in Berlin during the winter), the zone designator would be "**+01:00", "+0100", or simply "+01".** 

Vous ne pouvez pas accéder directement au fuseau horaire utilisateur via Php. Pour obtenir le fuseau horaire de l'utilisateur, vous devez obtenir son décalage et savoir si la sauvegarde de la lumière du jour est observée. Vous pouvez utiliser JavaScript pour obtenir ces informations:

function get_timezone_infos() { 
    var now = new Date(); 
    var jan1 = new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0); 
    var temp = jan1.toGMTString(); 
    var jan2 = new Date(temp.substring(0, temp.lastIndexOf(' ') - 1)); 
    var offset = (jan1 - jan2)/(1000); 

    var june1 = new Date(now.getFullYear(), 6, 1, 0, 0, 0, 0); 
    temp = june1.toGMTString(); 
    var june2 = new Date(temp.substring(0, temp.lastIndexOf(' ') - 1)); 
    var dst = offset != ((june1 - june2)/(1000)); 

    return { offset: offset, dst: dst }; 
} 

Base de données de stockage

D'abord la plupart, ce n'est pas vraiment difficile de dates de magasin dans une base de données. Mon choix préféré est le champ date-heure MySQL, où vous pouvez stocker la date et l'heure dans un champ. Vous devez stocker le DateTime dans le fuseau horaire UTC pour toutes les colonnes de type DateTime.

Définir le fuseau horaire DateTime UTC avant de l'enregistrer dans la base de données:

<?php 

function toDatabase($dateTime) 
{ 
    $dateTime->setTimezone(new DateTimeZone('GMT')); 
    return $dateTime; 
} 

Lors de la récupération du DateTime de la base de données définie au fuseau horaire d'origine:

<?php 

// set the timezone of the current user before calling the function 
date_default_timezone_set('Europe/Paris'); 

<?php 

function toUser($dateTime) 
{ 
    $dateTime->setTimezone(new DateTimeZone(date_default_timezone_get())); 
    return $dateTime; 
} 
+0

Je n'ai pas accès au fichier ini car il s'agit d'un serveur de test partagé et la modification du fichier .ini n'est pas autorisée. J'ai suivi votre code et la partie ne fera rien et une partie jettera des erreurs sur la page. si sûr que la réponse n'est pas valide. même si vous avez pris votre temps et l'avez écrit. –

+0

voir ceci http://stackoverflow.com/questions/4746249/get-user-timezone – krishna

+0

Je ne suis pas sûr de ce que j'ai dû voir sur cette page mais si vous faites référence à la première réponse, alors voici ce qui suit: Je pense cette solution est fondamentalement fausse (au moins dans certaines situations), car elle permet à l'utilisateur de changer l'heure, à tout ce qu'il veut, en appelant simplement domain.com/timezone.php ... aussi, j'ai trouvé que sur google . –

0

Vous pouvez facilement supprimer la entrez et remplacez-le par une liste déroulante de tous les fuseaux horaires disponibles. La liste des fuseaux horaires pris en charge par PHP est disponible dans le official PHP documentation. Ensuite, vous pouvez directement comparer les valeurs d'une liste à l'autre.

En outre, voir Generating a drop down list of timezones with PHP, où quelqu'un a fait cette liste pour vous.

DateTimeZone::listIdentifiers(DateTimeZone::ALL); crée également une liste des fuseaux horaires disponibles.

+0

bien c'est mon problème. créer une liste déroulante était la prochaine étape que j'allais suivre mais pour le moment j'ai besoin de savoir comment je peux "comparer les valeurs" que ce soit dans le formulaire de saisie ou dans une liste déroulante! –