Jump to content
HilarYo

Criação de aplicações com fuso horários

Recommended Posts

HilarYo

Boa noite,

Estou a estudar php e procuro soluções para um cenário do género: 

Por exemplo tenho uma aplicação de eventos em que cada utilizador pode introduzir eventos no seu fuso horário no entanto os outros utilizadores podem visualizá-los e podem estar com um fuso horário diferente. O objetivo seria mostrar os eventos no fuso horário dos utilizadores visitantes.

O Que me sugeriam?

 

Share this post


Link to post
Share on other sites
HilarYo

Certo isso dá-me basicamente a data e hora e a diferença horária da UTC. No caso de guardar os eventos na base de dados que fazia? Guardava o timestamp? Mas ao guardar o timestamp a nível de base de dados não seria muito legível. O que poderia fazer era guardar os eventos no horário padrão UTC na base de dados e depois converter? Qual seria a melhor prática?

Obrigado.

Share this post


Link to post
Share on other sites
vikcch

uma ideia, alguem regista às 13h um evento para as 15h e no servidor são 9h, registas o evento para as 11h (9+15-13).... se alguem chaga lá 1h depois com outro fuso horario por exemplo 5h no servidor são 10h e o evento é as 11h então mostras que o evento é às 6h (5+11-10)... eu fazia seguindo mais ou menos esta ideia...

Share this post


Link to post
Share on other sites
HilarYo
7 minutos atrás, vikcch disse:

uma ideia, alguem regista às 13h um evento para as 15h e no servidor são 9h, registas o evento para as 11h (9+15-13).... se alguem chaga lá 1h depois com outro fuso horario por exemplo 5h no servidor são 10h e o evento é as 11h então mostras que o evento é às 6h (5+11-10)... eu fazia seguindo mais ou menos esta ideia...

Não percebi bem esta ideia das 13h para as 15h?  e a conta 9+15-13 

Share this post


Link to post
Share on other sites
vikcch

hora local na altura do registo: 13h

hora do servidor na altura do registo: 9h

evento: 15h locais / 11h no servidor

hora do evento no servidor: 11h (9h+15h-13h)

 

 

se alguem chega lá 1h depois com outro fuso horario por exemplo 5h locais

no servidor são 10h e o evento é as 11h (no servidor)

então mostras que o evento é às 6h locais (5h+11h-10h)

 

provavelmente nem é a melhor maneira de fazer isso.... mas fica a ideia.... 

Share this post


Link to post
Share on other sites
HappyHippyHippo
7 hours ago, HilarYo said:

Certo isso dá-me basicamente a data e hora e a diferença horária da UTC. No caso de guardar os eventos na base de dados que fazia? Guardava o timestamp? Mas ao guardar o timestamp a nível de base de dados não seria muito legível. O que poderia fazer era guardar os eventos no horário padrão UTC na base de dados e depois converter? Qual seria a melhor prática?

Obrigado.

guardas como disse : guardas em UTC (assim como toda a gente que sabe o que faz)

apresentar não é mais do que ler o valor em UTC e apresentar em localtime

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo
3 horas atrás, HappyHippyHippo disse:

guardas como disse : guardas em UTC (assim como toda a gente que sabe o que faz)

apresentar não é mais do que ler o valor em UTC e apresentar em localtime

Sim mas como guardo uma data em UTC no mysql com date_default_timezone_set('Europe/Lisbon'); no PHP devolve-me a string: "2017-06-29T11:52:27+01:00" como guardo esta na base de dados uma vez que DATETIME e TIMESTAMP Apenas permitem data e hora?

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

usa int(11), e guarda o timestamp obtido da função strtotime do php

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo
7 minutos atrás, HappyHippyHippo disse:

usa int(11), e guarda o timestamp obtido da função strtotime do php

 

Ou seja na prática guardar as datas com o UTC do servidor PHP na base de dados e depois consoante o date_default_timezone_set('time_zone_utilizador'); serão transformadas é isso? Mas assim a nível de base de dados fica um pouco confuso ver números em vez de datas. Ou então posso até usar uma função deste género:

/**
 * @param $data_e   Data de entrada  Ex:. '29/05/2017 10:00:00'
 * @param $formato_e Formato da Data de entrada Ex:.(d/m/Y H:i:s)
 * @param $timezone_e Timezone da Data de entrada - http://php.net/manual/en/timezones.php
 * @param $timezone_s Timezone de Saída - http://php.net/manual/en/timezones.php
 * @param $formato_s Formato de saída Ex:.(d/m/Y H:i:s)
 * @return string
 */
function converter_data_timezone($data_e, $formato_e ,$timezone_e, $timezone_s, $formato_s)
{
$d = DateTime::createFromFormat($formato_e, $data_e, new DateTimeZone($timezone_e));
$d->setTimezone(new DateTimeZone($timezone_s));
return $d->format($formato_s);
}

O que me sugeria? No seu entender qual seria a melhor prática?

Share this post


Link to post
Share on other sites
HappyHippyHippo

as bases de dados não são para ser vistas são para ser usadas e interpretados por uma outra aplicação, o mesmo acontece com o binário ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo
58 minutos atrás, HappyHippyHippo disse:

as bases de dados não são para ser vistas são para ser usadas e interpretados por uma outra aplicação, o mesmo acontece com o binário ...

Esta certo mas então e se guardar as datas usando este esquema: 

$timestamp = strtotime('data_vinda_da_bd');

e

$data_a_inserir_na_bd = date('Y-m-d H:i:s', $timestamp);

Ou seja assim consigo guardar as datas certas de igual forma.

Na sua opinião qual é a melhor opção? 

Share this post


Link to post
Share on other sites
HappyHippyHippo

se pretendes guardar as datas em formato UTC(string) na base de dados, terás mais trabalho no que toca a fazer cálculos com estas ao nível do SQL

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo
21 minutos atrás, HappyHippyHippo disse:

se pretendes guardar as datas em formato UTC(string) na base de dados, terás mais trabalho no que toca a fazer cálculos com estas ao nível do SQL

Mas se for o caso posso usar para facilitar alguma query mais complexa:

SELECT UNIX_TIMESTAMP(tabela.data) AS DATA_EM_TIMESTAMP FROM tabela;

Com isto estava a tentar estudar como e qual a melhor forma de o fazer...

Share this post


Link to post
Share on other sites
HappyHippyHippo

da maneira como disse, deixas de ter de adicionar a função UNIX_TIMESTAMP ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo

Então cheguei a uma conclusão: Guardo tudo em timestamp e se por algum motivo precisar de visualizar a data em vez de números uso algo do género:

SELECT DATE_FORMAT(FROM_UNIXTIME(tabela.data_timestamp), '%Y-%m-%d %H:%i:%s') AS DATA_EM_DATETIME FROM tabela;

Estou certo?

Share this post


Link to post
Share on other sites
HappyHippyHippo

se pretendes fazer a projecção do timestamp numa string que percebes, sim, é uma solução ao nível do SQL


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo

Finalizando este assunto e resumindo:

  • O TIMESTAMP corresponde ao numero de segundos desde 01/01/1970 no fuso horário UTC.
  • Ao fazer no php date('d-m-Y H:i:s', strtotime('now')) este é apresentado conforme o fuso horário do servidor PHP.
  • A nível de base de dados o funcionamento é o mesmo, por isso convém ter o servidor de base de dados com o mesmo fuso horário do php para apresentar as datas corretas.

Share this post


Link to post
Share on other sites
HappyHippyHippo
1 hour ago, HilarYo said:

Finalizando este assunto e resumindo:

  • O TIMESTAMP corresponde ao numero de segundos desde 01/01/1970 no fuso horário UTC.
  • Ao fazer no php date('d-m-Y H:i:s', strtotime('now')) este é apresentado conforme o fuso horário do servidor PHP.
  • A nível de base de dados o funcionamento é o mesmo, por isso convém ter o servidor de base de dados com o mesmo fuso horário do php para apresentar as datas corretas.

sim, mas o problema é se o teu servidor web e o servidor mysql estiverem no fuso horário X mas o cliente web estiver no fuso Y ..

é por isso que se usa o UTC

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HilarYo
3 horas atrás, HappyHippyHippo disse:

sim, mas o problema é se o teu servidor web e o servidor mysql estiverem no fuso horário X mas o cliente web estiver no fuso Y ..

é por isso que se usa o UTC

Pois o que é fantastico e neste caso o timestamp facilita bastante. Deixo aqui mais algumas informações para quem esteja em uma situação idêntica:

Lista de timezones PHP: http://php.net/manual/en/timezones.php

Alterar timezone servidor PHP (Ficheiro php.ini):

[Date]
; Defines the default timezone used by the date functions
date.timezone = "Europe/Lisbon"

Alterar timezone no MySQL:

SET GLOBAL time_zone = '+01:00';

https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

No PHP basta usar para alterar as horas para aquela zona:

<?php
//Trocar time_zone por um da lista: http://php.net/manual/en/timezones.php
date_default_timezone_set('time_zone');

 

Se guardarmos a timezone de cada utilizador na base de dados ou no cookie facilmente se torna dinâmico! 

<?php
$timezone_vindo_da_bd_ou_cookie = 'Africa/Casablanca';

date_default_timezone_set($timezone_vindo_da_bd_ou_cookie);

/**
 * Continuação do código com datas (timestamp)
 * ******
 *
 */

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.