Impostazione del fuso orario in PHP. Date timezone - Imposta il fuso orario in PHP e MySQL Come impostare il fuso orario di php

Impostazione del fuso orario in PHP. Date timezone - Imposta il fuso orario in PHP e MySQL Come impostare il fuso orario di php

date_default_timezone_set utc(6)

new PDO("mysql:host=localhost;dbname=nametable", "username", "password", );

Queste date devono essere confrontate in MySQL usando la funzione NOW() per restituire la differenza in ore, in questo modo:

SELEZIONA TIMESTAMPDIFF (ora, ORA (), finalize_at) DA piani;

Ma il problema è che la funzione PHP date("Ymd H:i:s") usa l'impostazione del fuso orario PHP e la funzione NOW() prende l'ora MySQL dal server MySQL.

sto cercando di risolvere questo:

  1. date_default_timezone_set("Europa/Parigi"); Funziona solo per PHP.
  2. date.timezone="Europa/Parigi"; Funziona solo per PHP.
  3. SELECT CONVERT_TZ(ora(), "GMT", "MET"); Questo ritorna vuoto.
  4. mysql> SET time_zone = "Europa/Parigi"; Questo genera un errore dalla console MySQL.

E il fuso orario per MySQL non cambia.

C'è un modo per cambiare il fuso orario per PHP e MySQL senza doverlo fare dalla console MySQL o impostare la modifica del fuso orario da qualche parte in php.ini e rendere questi valori disponibili sia per PHP che per MySQL.

Apprezzo molto il tuo supporto.

Puoi farlo facilmente con solo due righe di PHP.

$tz = (new DateTime("now" , new DateTimeZone("Asia/Kabul" )))-> format("P"); $pdo -> exec("SET time_zone="$tz";");

Per PHP usa questa funzione:

date_default_timezone_set() default-timezone="fuso orario"

Se hai il privilegio radice, è possibile impostare il valore del server dell'orologio globale in fase di esecuzione con questa istruzione:

IMPOSTA fuso orario GLOBALE = fuso orario ;

Fuso orario per connessione. Ogni client che si connette ha il proprio fuso orario, dato dalla variabile time_zone . La variabile di sessione inizialmente prende il suo valore dalla variabile time_zone globale, ma il client può cambiare il proprio fuso orario con questa istruzione:

IMPOSTA fuso orario = fuso orario ;

Metodo migliore Imposta il fuso orario in PDO MySQL:

Se necessario, per errore puoi usare: date("P") Esempio:

nuova DOP( "mysql:host=localhost;dbname=nametable", "nome utente" , "password" , [ PDO :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8;SET time_zone = "". data("P" ). """ ]);

Posso cambiare il mio fuso orario mysql predefinito dalla sezione delle variabili modificando la riga che dice "timezone" in phpmyadmin.

Qui puoi anche cambiare il formato e altro puoi trovare nel supporto di mysql http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html Spero che ti aiuti.

$unsafe_variable = (is_numeric($_POST["user_input"]) ? $_POST["user_input"] : "");

Ed è molto meglio usare queste funzioni per convalidare l'input mysql_real_escape_string.

L'impostazione del fuso orario (predefinito) è molto importante per una corretta elaborazione dei dati. Questo articolo "Impostazione del fuso orario in php.ini" ti aiuterà a imparare come impostare il fuso orario nel file di configurazione PHP (php.ini) o all'interno di qualsiasi script PHP per un uso temporaneo.

Impostazione del fuso orario in php.ini

Per impostare il fuso orario predefinito per il tuo ambiente PHP, segui questi 4 semplici passaggi.

1. Devi trovare il file di configurazione php.ini e questo può essere fatto:

# trova / -digita f -name php.ini

Per impostazione predefinita, php.ini è in:

Per CentOS, RedHat o Fedora saranno:

/etc/php.ini

Per Ubuntu, Debian o LinuxMint sarà:

/etc/php5/apache2/php.ini

2. Il prossimo passo è cercare i fusi orari (per la tua posizione), per questo dovresti visitare il sito e trovare la tua zona per php:

3. Registriamo la zona trovata nel file php.ini. Ad esempio, prenderò la mia zona - "Europa/Kiev". Apri il file di configurazione e apporta le modifiche:

[...] date.timezone = "Europa/Kiev" [...]

ATTENZIONE! Cerca l'opzione "date.timezone" in questo file, forse questo parametro è già registrato.
4. Riavvia il server web:

# servizio httpd riavvio

# riavvio del servizio apache2

Se un altro server (nginx, tomcat, lighttpd), riavvialo.

Inoltre, puoi impostare questo parametro nel file php stesso come segue:

La configurazione del fuso orario in php.ini è ora completa.


Questo è un breve articolo su come lavorare con i fusi orari durante la memorizzazione di valori di data/ora in un database. I database o il linguaggio di programmazione che si decide di utilizzare non sono critici, poiché i fenomeni descritti nell'articolo sono universali. Mostrerò le mie azioni usando il bundle MySQL e PHP come esempio. Il problema con i fusi orari è piuttosto banale. Molti spesso dimenticano la loro esistenza e alcuni li considerano qualcosa di eccessivamente complicato. Di solito, quando si configura un database o quando si utilizza un servizio di web hosting, i fusi orari sono configurati per impostazione predefinita. Le impostazioni predefinite vanno bene se stai utilizzando un singolo server, ma cosa succede se decidi di spostarlo?

La stessa domanda è logica se hai più server in posizioni diverse.
Invece di memorizzare i fusi orari con ciascuna data, è meglio iniziare con l'ora solare e associare ad essa tutte le date. Questo metodo consente di effettuare una transizione all'ora solare prima che il valore venga archiviato nel database. In generale, è una buona idea usare solo UTC +00:00.

Cos'è l'UTC

Il formato UTC sta per Coordinated Universal Time ed è il successore di Greenwich Mean Time (GMT). I due formati sono quasi identici, ma UTC è considerato lo standard accettato. In generale, UTC si basa su 40 diversi fusi orari. È consuetudine prendere 00:00 ore come punto di partenza in UTC. In totale, ci sono 12 fusi orari principali, sia con valori positivi che negativi, oltre ad alcuni fusi orari aggiuntivi, come la mezz'ora UTC +04:30. L'idea è che se hai un fuso orario UTC-05:00, quindi devi sottrarre 5 ore dall'iniziale UTC +00:00 per ottenere la corrispondenza desiderata. Cioè, se sono le 14:00 (o le 14:00) e il tuo fuso orario lo è UTC-05:00(EST o Fuso orario orientale), quindi UTC +00:00 sarà uguale alle 19:00 (o 19:00).
  • Rappresentazione grafica dei fusi orari mondiali (Wikipedia)
  • Elenco delle abbreviazioni del fuso orario (Wikipedia)

Memorizzare l'ora nel formato UTC +00:00

La prima cosa che dobbiamo fare è decidere quale fuso orario utilizzare per memorizzare tutti i nostri valori. Consiglio vivamente di prendere UTC +00:00- per nessun motivo particolare se non che è facile da ricordare e 0 è il punto di riferimento ideale. Dal momento che sappiamo che tutte le date sono in UTC +00:00, diventa molto più semplice rappresentare l'ora corretta per ciascun utente in base ai propri fusi orari personali. Una volta che l'utente ha scelto (o abbiamo rilevato automaticamente) il proprio fuso orario, l'output dell'ora appropriata per quell'utente diventa un luogo comune.

Impostazione del fuso orario predefinito

Supponendo che tutte le nostre date/ora siano archiviate in UTC, possiamo semplicemente impostare il fuso orario predefinito da utilizzare per visualizzare ogni volta. Questo raccoglierà automaticamente la data e l'ora per un utente specifico. In PHP, tutto ciò che dobbiamo fare è impostare il fuso orario, in questo modo:
date_default_timezone_set("EST");
Possiamo farlo in alcuni blocchi di inizializzazione nella parte superiore del nostro codice e il gioco è fatto: tutte le date verranno visualizzate correttamente per il fuso orario in cui si trova l'utente.

Se vogliamo avere il pieno controllo su data e ora, possiamo costruire una funzione come questa:
funzione get_date($date) ( date_default_timezone_set("EST"); $date = date("Y-m-d H:i:s", strtotime($date)); date_default_timezone_set("UTC"); return $date; )

Impostazione PHP su UTC +00:00

Ovviamente, le cose non sarebbero così facili se non impostassimo il nostro sistema su UTC come fuso orario predefinito. Sono sicuro che può essere fatto più o meno allo stesso modo in altre lingue, ma in PHP è fatto in questo modo:
data.fuso orario = UTC
Ora ogni volta che usiamo cose come ad esempio la funzione volta(), questo ci fornisce automaticamente l'ora UTC con l'offset appropriato in base all'ora del nostro server. Se vogliamo impostare le date in un database come MySQL, facciamo questo:
date("Y-m-d H:i:s", ora());
Se non abbiamo avuto accesso per modificare la configurazione PHP, dobbiamo impostare l'ora manualmente durante l'impostazione della data, in questo modo:
date("Y-m-d H:i:s", time() - date("Z"));

Impostazione di MySQL su UTC +00:00

L'impostazione diretta della data, come abbiamo fatto sopra, è applicabile se non abbiamo accesso per modificare i parametri di configurazione di MySQL. Tuttavia, se vogliamo usare SEGNALIBRO, che di solito si aggiorna automaticamente, o una funzione data da MySQL come ADESSO(), quindi dobbiamo configurare MySQL per utilizzare UTC come fuso orario predefinito.

In MySQL questo viene fatto impostando l'offset UTC, che può essere fatto altrettanto facilmente come in PHP apportando le seguenti modifiche:
fuso orario predefinito = "+00:00"

Aggiorna date/orari esistenti

Se decidi di standardizzare i fusi orari utilizzando UTC, dove si trova il fuso orario predefinito UTC +00:00 offset, l'ora corrente nel database non sarà più valida.

Fortunatamente, MySQL fornisce una pratica funzionalità che ci consente di aggiornare facilmente i fusi orari esistenti.

NOTA: Se hai dei timestamp, devi prima aggiornarli.

Possiamo cercare tutti i campi di data e ora nel nostro database con la seguente query:
SELECT * FROM `information_schema`.`COLUMNS` DOVE `TABLE_SCHEMA`="table_name" AND (`DATA_TYPE`="timestamp" OR `DATA_TYPE`="datetime" OR `DATA_TYPE`="date");
Da qui, possiamo utilizzare la seguente query per aggiornare le date/orari nelle nostre tabelle:
AGGIORNAMENTO `table_name` SET `timestamp`=CONVERT_TZ(`timestamp`, "-05:00", "+00:00");
Dove -05:00 - il fuso orario corrente in cui è memorizzata l'ora (come nel caso precedente, si riferisce a Orientale). Fuso orario +00:00 , a cui vogliamo convertire, in questo caso si riferisce a UTC.

Se durante il processo di gestione dell'hosting virtuale si è reso necessario modificare il fuso orario predefinito, questa azione può essere facilmente eseguita in pochi passaggi, descritti di seguito.

Modifica il fuso orario tramite Seleziona versione PHP

Per modificare il fuso orario vai su cPannello -> Software -> Seleziona Versione PHP -> Passa alle opzioni PHP.

Il passaggio successivo consiste nel modificare il valore della variabile data.fuso orario al fuso orario di cui hai bisogno. Puoi trovare l'elenco dei fusi orari disponibili nell'ultimo paragrafo dell'articolo.

Dopo aver apportato le modifiche necessarie, è importante fare clic sul pulsante "Salvare le modifiche" che si trova in fondo alla pagina Selettore PHP.

Per assicurarti che sia stato applicato il valore del fuso orario specificato, puoi utilizzare la funzione PHP phpinfo(), che mostra informazioni su tutte le opzioni php impostate. Per fare ciò, crea public_html fare clic sul pulsante "File" nel menu del controller.

  • In campo Nuovo nome file indicare, ad esempio, phpinfo.php quindi premere il pulsante Crea nuovo file.

  • Di conseguenza, il file con il nome specificato apparirà nell'elenco degli altri sull'hosting.
  • Successivamente, è necessario aprire questo file per la modifica. Per fare ciò, fai clic con il pulsante sinistro del mouse sul file desiderato, quindi nel menu del dispatcher, fai clic sul pulsante Modificare.
  • Nella maschera che compare, lascia tutti i parametri di default e clicca sul pulsante Modificare, per aprire un editor di testo.

  • Nella finestra che si apre, inserisci il seguente codice:

Quindi salva il file e aprilo in un browser. In questo esempio, il file sarà disponibile all'indirizzo:

http://dominio_principale/phpinfo.php

Nella pagina che si apre, trova la sezione Data, che conterrà una tabella con il valore del fuso orario corrente. In questo caso, viene visualizzata l'area sopra Europa/Kiev.

Questo completa il processo di modifica del fuso orario.

Elenco dei fusi orari per impostare il fuso orario

Inoltre, ecco un elenco di possibili valori di fuso orario:

Africa/Cairo Africa/Casablanca Africa/Harare Africa/Monrovia Africa/Nairobi America/Bogota America/Buenos_Aires America/Caracas America/Chihuahua America/La_Paz America/Lima America/Mazatlan America/Mexico_City America/Monterrey America/Santiago America/Tijuana Asia/ Almaty Asia/Baghdad Asia/Baku Asia/Bangkok Asia/Chongqing Asia/Dhaka Asia/Hong_Kong Asia/Irkutsk Asia/Jakarta Asia/Gerusalemme Asia/Kabul Asia/Karachi Asia/Kathmandu Asia/Kolkata Asia/Krasnoyarsk Asia/Kuala_Lumpur Asia/Kuwait Asia /Magadan Asia/Mascate Asia/Novosibirsk Asia/Riyadh Asia/Seoul Asia/Singapore Asia/Taipei Asia/Tashkent Asia/Tbilisi Asia/Teheran Asia/Tokyo Asia/Ulaanbaatar Asia/Urumqi Asia/Vladivostok Asia/Yakutsk Asia/Yekaterinburg Asia/Yerevan Atlantico/Atlantico delle Azzorre/Atlantico del Capo Verde/Stanley Australia/Adelaide Australia/Brisbane Australia/Canberra Australia/Darwin Australia/Hobart Australia/Melbourne Australia/Perth Australia/Sydney Canada/Canada atlantico/Canada Terranova/Saskatchewan Europa/Amsterdam Europa /Atene Europa/Belgrado Europa/Berlino Europa/Bratislava Europa/Bruxelles Europa/Bucarest Europa/Budapest Europa/Copenaghen Europa/Dublino Europa/Helsinki Europa/Istanbul Europa/Kiev Europa/Lisbona Europa/Lubiana Europa/Londra Europa/Madrid Europa/Minsk Europa/Mosca Europa/Parigi Europa/Praga Europa/Riga Europa/Roma Europa/Sarajevo Europa/Skopje Europa/Sofia Europa/Stoccolma Europa/Tallinn Europa/Vienna Europa/Vilnius Europa/Volgograd Europa/Varsavia Europa/Zagabria Groenlandia Pacifico/Auckland Pacifico /Fiji Pacific/Guam Pacific/Midway Pacific/Port_Moresby USA/Alaska USA/Arizona USA/Stati Uniti centrali/Stati Uniti orientali/Stati Uniti dell'Indiana orientale/Stati Uniti Hawaii/Stati Uniti di montagna/Stati Uniti del Pacifico/Samoa

Vuoi un nuovo nome per il sito web? Abbiamo a disposizione

cinghie automatiche (6)

Ho bisogno di sapere in quale fuso orario si trovano i miei utenti in base alla loro intestazione IP o HTTP.

Ho ricevuto molte risposte a questa domanda, ma non riuscivo a capire la risposta. Alcuni dicono di usare -new Date().getTimezoneOffset()/60(). Ma cosa significa?

Ho date_default_timezone_set("Asia/Calcutta"); nella radice della mia pagina (index.php). Quindi per questo devo impostare dinamicamente il fuso orario e impostarlo invece di Asia/Calcutta .

Risposte

Le informazioni sul fuso orario del browser non fanno parte della specifica HTTP, quindi non puoi semplicemente ottenerle dall'intestazione.

Se disponi delle coordinate della posizione (ad esempio, da un dispositivo GPS mobile), puoi trovare il fuso orario utilizzando uno di questi metodi. Tuttavia, la geolocalizzazione per indirizzo IP non è un'ottima soluzione, perché spesso l'indirizzo IP del provider o del server proxy, che potrebbe trovarsi in un fuso orario diverso.

Ci sono alcune strategie che puoi usare per provare a determinare il fuso orario, come usare la libreria jsTimeZoneDetect, che è un ottimo punto di partenza ma non abbastanza perfetto da non poter fare affidamento solo su di esso. Se stai usando moment.js, moment-time ha una funzione integrata chiamata moment.tz.guess() che fa esattamente la stessa cosa.

L'idea di utilizzare la funzione getTimezoneOffset() di JavaScript è sbagliata in quanto non si ottiene il fuso orario, solo un offset per una data specifica. Vedi la sezione wiki dell'argomento del tag TimeZone intitolato "TimeZone! = Spostamento".

Comunque la guardi, alla fine devi decidere uno dei due approcci:

  • Chiedi all'utente di informarti sul proprio fuso orario, da un elenco a discesa o da un controllo del fuso orario basato sulla mappa.
  • Invia l'ora al browser solo in UTC e usa JavaScript nel browser per convertire in qualsiasi fuso orario locale su cui l'utente può impostare il proprio computer.

Ne discuto in modo più dettagliato (in termini di AC#) in questa risposta.

Il fuso orario non è disponibile nell'intestazione HTTP, ma il paese (abbreviazione) è nell'intestazione ACCEPT_LANGUAGE. Sarà qualcosa come "en-US" (US è il prefisso internazionale). Questo può essere combinato con le informazioni JavaScript per avere un'idea del fuso orario dell'utente.

Questo è quello che uso in JS:

Funzione timezone() ( var now = new Date(); var jano = new Date(now.getFullYear(), 0, 1).getTimezoneOffset()/-60; var julo = new Date(now.getFullYear(), 6 , 1).getTimezoneOffset()/-60; var tz = Math.min(jano, julo); if (jano != julo) tz += ((jano< julo) ? "S" : "W") + Math.abs(jano - julo); return tz; }

Questo restituisce una stringa come "-6S1" per la zona centrale (l'offset dell'ora standard è -6 ore, l'ora legale è in vigore in estate e aggiunge 1 ora). Sto usando un cookie per renderlo disponibile per PHP. PHP ricerca nel database TZ le zone che corrispondono a questo e ai paesi. Perché qui (USA, -6S1) ci sono 7 zone corrispondenti, la prima è "America/Chicago".

A proposito, ci sono due zone nel database in cui l'ora legale aggiunge qualcosa di diverso da 1 ora: Lord Howe Island (10.5W0.5) e Troll Station, Antartide (0W2).

Uno di questi è chiederglielo! Soprattutto in quei sistemi membri in cui è possibile acquisire/registrare un utente: a quel punto dagli una scelta. Semplice ma preciso.

Questo funziona alla grande...

eco<< if (navigator.cookieEnabled) document.cookie = "tzo="+ (- new Date().getTimezoneOffset()); EOE; if (!isset($_COOKIE["tzo"])) ( echo<< if (navigator.cookieEnabled) document.reload(); else alert("Cookies must be enabled!"); EOE; morire(); ) $ts = new DateTime("now", new DateTimeZone("GMT")); $ts->add(DateInterval::createFromDateString($_COOKIE["tzo"]."minuti"));

Per riassumere la risposta di Matt Johnson in termini di codice:

Non che questa sia una raccomandazione, tanto più c'è stata una divisione del paradigma, ma soprattutto aggressivo Il modo per gestire le informazioni sul fuso orario in un'applicazione Web (che non è esclusiva di ASP.NET MVC) era il seguente:

    Tutti gli orari sul server sono UTC. Ciò significa utilizzare, come hai detto, DateTime.UtcNow .

    Cerca di non fidarti del client passando le date al server il meno possibile. Ad esempio, se hai bisogno di "adesso", non creare una data sul client e poi passarla al server. Crea la data nel tuo GET e passala a ViewModel o POST do DateTime.UtcNow .

Tariffa abbastanza standard finora, ma è qui che le cose si fanno "interessanti".

    Se devi accettare una data da un client, usa javascript per assicurarti che i dati che invii al server siano in formato UTC. Il client sa in quale fuso orario si trova, quindi può convertire l'ora in UTC con ragionevole precisione.

    Durante il rendering delle viste, hanno utilizzato un elemento HTML5

    Utilizzeranno quindi javascript per convertire l'ora UTC nell'ora locale del client. Lo script troverà tutti gli elementi

In questo modo, non hanno mai dovuto tracciare, memorizzare o gestire il fuso orario dei clienti. Al server non importava in quale fuso orario si trovasse il client e non era necessario eseguire alcuna traduzione del fuso orario. Sputava semplicemente UTC e lascia che il client lo converta in qualcosa di ragionevole. Questo è facile dal browser perché sa in quale fuso orario si trova. Se il client ha modificato il proprio fuso orario, l'applicazione Web si aggiornerà automaticamente. L'unica cosa che conservavano era la stringa di formato della data per la locale dell'utente.

Non sto dicendo che questo sia l'approccio migliore, ma era una cosa completamente diversa che non avevo mai visto prima. Potresti ricavarne spunti interessanti.

© 2022 hecc.ru - Notizie sulla tecnologia informatica