FUNCIONS PER EXPRESSAR DATES EN UN LLENGUATGE

 

PHP és un llenguatge amb marcada influència anglosaxona causa dels seus orígens i desenvolupament. Però quan estem creant pàgines web és freqüent que volem obtenir dates expressades en el llenguatge amb el qual estem desenvolupant la web. Anem a estudiar com fer-ho.

 

 

Setlocale

La funció setlocale és una funció PHP utilitzada per a indicar la configuració regional que s'hauria d'utilitzar per realitzar determinades tasques. La seva sintaxi és la següent:

setlocale ($procesosAfectados, $codConfiguracio1, $codConfiguracio2, ..., $codConfiguracioN);

També s'admet: setlocale ($procesosAfectats, $arrayDeCodigDeConfiguracio);

Aquesta funció pretén que per exemple en lloc de 2089 July, Mon 21st pugui aparèixer alguna cosa com "21 juliol 2089" si ho desitgem.Per a això indicaríem que el procés afectat és la data i que la configuració és l'espanyol: setlocale (LC_TIME, "ca_ES");

Aquesta idea, aparentment bona, es topa amb nombroses dificultats en la pràctica:

a) No tots els servidors admeten tot tipus de canvis.

b) Segons el servidor que estiguem utilitzant, podreu utilitzar uns llenguatges o no.

c) La comunicació entre les aplicacions web i altres entorns com a bases de dades es pot veure afectada i poden sorgir problemes.

d) No tots els servidors admeten el mateix nom - codi de configuració

e) Més problemes que no anem a citar aquí.

En resum, heu de tenir present que el canvi de la configuració local del servidor pot ser complexa o no respondre com es podria esperar: pots accedir a milers de consultes en fòrums sobre aquest tipus de problemes, i moltes d'elles sense resposta. És recomanable fer proves i si cal programar petits scripts o funcions per aconseguir el funcionament que nosaltres desitgem. Amb això volem dir que pot resultar més senzill treballar de la manera natural tal com estigui configurat el servidor, en lloc de tractar d'alterar aquesta configuració perquè el servidor treballi en el nostre idioma.

Els valors possibles per $procesosAfectats són els següents:

Valor $procesosAfectats

Aplicació

LC_ALL

Per a tots els processos

LC_COLLATE

Per a la comparació de strings

LC_CTYPE

Per a la classificació i conversió de caràcters, per exemple quan s'usi strtoupper()

LC_MONETARY

Afecta a aspectes com el símbol de moneda, separador de milers, etc.

LC_NUMERIC

Per al separador decimal i altres aspectes com signes.

LC_TIME

Per al format de data i hora que es mostrarà en usar la funció strftime()

LC_MESSAGES

Per a les respostes del sistema.

Nosaltres en aquest curs anem a limitar-nos a estudiar i veure un exemple d'ús per a mostrar dates usant la funció de php strftime que estudiarem a continuació combinada amb l'ús de setlocale amb LC_TIME. L'ús de setlocale pot tenir efectes col·laterals (afectar altres processos) pel que recomanem no usar-lo sense fer proves exhaustives per verificar la resposta esperada.

Els codis de països depenen del sistema operatiu amb el qual estiguem treballant. La funció setLocale admet que s'introdueixi una llista de codis de països amb l'esperança que alguns d'ells sigui reconegut pel sistema (la qual cosa parla ja de les dificultats que es troben per realitzar aquest tipus d'operacions).

A continuació assenyalem algunes formes de codis d'alguns països:

País

Codi (*)

Un altre codi (*)

Mèxic

es_MX.UTF-8

pt_BR

Espanya

ca_ES.UTF-8

ca_ES

Argentina

es_RA.UTF-8

es_RA

Colòmbia

es_CO.UTF-8

es_CO

Veneçuela

es_VE.UTF-8

es_v a

Perú

es_PE.UTF-8

es_PE

Xile

es_CL.UTF-8

es_CL

Guatemala

es_GT.UTF-8

es_GT

Equador

es_EC.UTF-8

es_EC

Cuba

es_CU.UTF-8

es_CU

Bolívia

es_RB.UTF-8

es_RB

República Dominicana

es_DO.UTF-8

es_DO

Hondures

es_HN.UTF-8

es_HN

El Salvador

es_SV.UTF-8

es_SV

Paraguai

es_PY.UTF-8

es_PY

Nicaragua

es_NI.UTF-8

es_NI

Costa Rica

es_CR.UTF-8

es_CR

Port Ric

es_PR.UTF-8

es_PR

Panamà

es_PA.UTF-8

es_PA

Uruguai

es_UY.UTF-8

es_UY

Guinea Equatorial

es_GQ.UTF-8

es_GQ

(*) Tenir en compte que no tots els codis funcionaran, ja que depèn del servidor amb el qual estiguem treballant el que siguin reconeguts o no. Recomanem utilitzar ca_ES.UTF-8. Hi ha més codis part dels aquí indicats.

L'exemple d'ús de setlocale ho veurem a continuació costat del de la funció strftime.

 

FUNCIÓ strftime PHP

La funció strftime és una funció PHP utilitzada per obtenir una cadena de text expressada en el llenguatge de la configuració local del servidor (per defecte o establerta a través de setlocale). La seva sintaxi és la següent:

strftime ($cadenaAmbMarcas, $valorTempsEnSegons)

$ValorTempsEnSegons indica els segons transcorreguts des de l'1 gener 1970 00:00:00 GMT.

Si s'omet $valorTempsEnSegons es pren el valor corresponent a l'hora actual local del servidor.

El valor $cadenaAmbMarcas fa referència a l'ús de codis especials que tornen un determinat resultat. Per exemple tiro strftime (Avui és% A); ens retornarà "Avui és dilluns" si la configuració d'idioma del servidor és espanyol, o "Avui és monday" si la configuració d'idioma del servidor és anglès, ja que el codi% A equival a "dia de la setmana".

Un altre exemple: echo 'Data actual:' .strftime ("% A,% d de% B de% I"). '<br/>'; retornarà alguna cosa similar a << dijous, setembre 4, 2089 >> si la configuració d'idioma del servidor és espanyol.

A la següent taula es resumeixen els codis disponibles:

Ús per

Codi

Descripció

Exemple valors retornats

Dia

% Una

Dia, en forma abreujada

Dom fins Sab

Dia

% A

Dia, complet

Diumenge fins dissabte

Dia

% De

El dia del mes amb dos dígits (amb zeros inicials)

Gener 1 31

Dia

% I

El dia del mes, amb un espai precedint si <10.

Gener 1 31

Dia

% J

Dia de l'any, 3 dígits amb zeros inicials

001 1 366

Dia

En%

Representació numèrica ISO-8601 del dia de setmana

1 (per dilluns) fins a 7 (per Diumenge)

Dia

% En

Representació numèrica del dia de la setmana

0 (per a Diumenge) fins a 6 (per dissabte)

Setmana

En%

Nombre de setmana de l'any donat, començant amb el primer Diumenge com a primera setmana

13 (per a la 13a setmana de l'any)

Setmana

% V

Nombre de setmana segons ISO-8601

01-53

Setmana

% W

Nombre de setmana de l'any, començant amb el primer dilluns com la primera setmana

46 (per a la 46a setmana de l'any)

El meu

% B

Nom del mes abreujat

Gener fins desembre

El meu

% B

Nom del mes complet

Gener fins desembre

El meu

% H

Nom del mes abreujat, igual que% b

Gener fins desembre

El meu

% M

Representació de dos dígits del mes

01 (per a Gener) fins a 12 (per a desembre)

Any

% C

Representació de dos dígits del segle (any dividit entre 100, truncat a un sencer)

19 per al Segle XX

Any

% G

Representació de dos dígits de l'any segons ISO-8601

Exemple: 89 per 6 gener 2089

Any

% G

La versió de quatre dígits completa de% g

Exemple: 2089 per 13 gener 2089

Any

% I

Representació de dos dígits de l'any

Exemple: 09 per 2009, 79 per a 1979

Any

% I

Representació de quatre dígits de l'any

Exemple: 2038

Hora

% H

Representació de dos dígits de l'hora

00-23

Hora

% K

Representació de dos dígits de l'hora, amb un espai precedint als dígits simples

0-23

Hora

% JO

Representació de dos dígits de l'hora

01-12

Hora

% L (ell)

L'hora en format de 12 hores, amb un espai si <10

1-12

Hora

% M

Representació de dos dígits dels minuts

00-59

Hora

% P

'AM' o 'PM' en MAJÚSCULES basats en l'hora donada

Exemple: AM per 00:31, PM per 22:23

Hora

% P

'Am' o 'pm' en minúscules basats en l'hora donada

Exemple: am per 00:31, am per 22:23

Hora

% R

El mateix que "% I:% M:% S% p"

Exemple: 09:34:17 PM per 21:34:17

Hora

% R

El mateix que "% H:% M"

Exemple: 16:44 per 04:44 PM

Hora

% S

Representació de dos dígits dels segons

00-59

Hora

% T

El mateix que "% H:% M:% S"

Exemple: 21:34:17 per 9:34:17 PM

Hora

% X

Representació preferida de l'hora basada en la configuració regional, sense la data

Exemple: 03:59:16 o 15:59:16

Hora

% De

L'índex de la zona horària.

Exemple: -0500 per Hora Est dels EUA

Hora

% Z

L'abreviatura de la zona horària

Exemple: EST per Hora de l'Est dels EUA

Data i hora

% C

Marca preferida de la data i hora basades en la configuració regional

Exemple: Tue febrer 5 00:45:10 2009 per el 5 de Febrer de 2009 a les 12:45:10 AM

Data i hora

D%

El mateix que "% m /% d /% i"

Exemple: 02/05/89, 5 febrer 2089

Data i hora

% F

El mateix que "% I-% m-% d" (normalment usat en les marques de data de bases de dades)

Exemple: 2089.02.05 per 5 febrer 2089

Data i hora

% X

Representació preferida de la data basada en la configuració local, sense l'hora

Exemple: 02/05/09 per al 5 febrer 2009

A més de les marques indicades existeixen altres com% n per inserir un salt de línia o% t per inserir una tabulació.

Tingues en compte que no tots els servidors disposen de tots els codis ni tots els servidors de respondre com s'espera quan tractis de fer que mostrin una data en un format donat. Per exemple alguns servidors no admeten% p ni% P, en aquest cas si intentes que es mostri AM/PM no es mostrarà res. Hauràs de resoldre escrivint codi específic per a aconseguir-ho.

Per provar el funcionament d'aquesta funció, en combinació amb setlocale, escriu aquest codi i comprova quins resultats obtens:

<Charset meta = "UTF-8">

<? Php

$mevaData=gmmktime(12,0,0,1,15,2089);

echo 'Abans de setlocale strftime retorna:' .strftime("% A,% d de% B de% I", $mevaData). '<br/>';

echo 'Abans de setlocale data Retorna:' .date("l, DMA (H: i: s)", $mevaData) '<br/>';.

setlocale(LC_TIME, "ca_ES");

echo 'Després de setlocale ca_ES date retorna:' .date ("l, DMY (H: i: s)", $mevaData). '<br/>';

echo 'Després de setlocale ca_ES strftime torna:' .strftime ("% A,% d de% B de% I", $mevaData). '<br/>';

setlocale (LC_TIME, 'ca_ES.UTF-8');

echo 'Després de setlocale ca_ES.UTF-8 date retorna:' .date ("l, DMY (H: i: s)", $mevaData). '<br/>';

echo 'Després de setlocale ca_ES.UTF-8 strftime torna:' .strftime ("% A,% d de% B de% I", $mevaData). '<br/>';

setlocale (LC_TIME, 'de_DE.UTF-8');

echo 'Després de setlocale de_DE.UTF-8 Data Retorna:' .Date ("l, DMA (H: i: s)", $mevaData) '<br/>';.

echo 'Després de setlocale de_DE.UTF-8 strftime torna:' .strftime ("% A,% d de% B de% I", $mevaData). '<br/>';

?>

El resultat que nosaltres hem obtingut amb un servidor ubicat a Denver (USA) és el següent:

Abans de setlocale strftime retorna: Saturday, 15 de gener de 2089

Abans de setlocale date retorna: Saturday, 2089.01.15 (5:00:00)

Després de setlocale ca_ES date retorna: Saturday, 2089.01.15 (5:00:00)

Després de setlocale ca_ES strftime retorna: dissabte, 15 gener 2089

Després de setlocale ca_ES.UTF-8 date retorna: Saturday, 2089.01.15 (5:00:00)

Després de setlocale ca_ES.UTF-8 strftime retorna: dissabte 15 gener, 2089

Després de setlocale de_DE.UTF-8 date retorna: Saturday, 2089.01.15 (5:00:00)

Després de setlocale de_DE.UTF-8 strftime retorna: Samstag, 15 de Januar de 2089

Nota: comprova que fas servir com a codificació per al teu arxiu php "Codificació UTF-8 sense BOM". Tingues en compte que els resultats que obtinguis poden ser diferents a aquests ja que depenen de la configuració que tingui establerta teu servidor.

Anem a comentar els resultats obtinguts:

Hem creat la variable $mevaData el contingut és el nombre de segons des de l'1 gener 1970 00:00:00 GMT per a la data 15 gener 2089 12:00:00 GMT. Com l'hora local té un retard de 7 hores respecte a l'hora GMT, en demanar que es mostri per pantalla la data i hora amb strftime se'ns mostra << Saturday, 15 de gener de 2089 >>. Aquest valor ens ve en anglès perquè la configuració local del servidor és "idioma anglès".

En canviar la configuració local d'idioma amb setlocale a ca_ES obtenim la data en espanyol, però en lloc de dissabte se'ns mostra s? Vat. La funció date segueix retornant la data en anglès perquè aquesta funció no és sensible a la configuració local d'idioma.

En canviar la configuració local d'idioma amb setlocale a 'ca_ES.UTF-8' ja obtenim la data correctament escrita en espanyol.

A tall d'exemple, hem canviat la configuració a alemany per comprovar el que es visualitza (la data escrita en alemany).

Podríem haver escrit setlocale (LC_TIME, 'ca_ES', 'ca_ES.UTF-8'); ¿Què passarà en aquest cas? Es prendrà el primer codi reconegut dins de la llista de codis. En aquest cas ca_ES és un codi reconegut, tot i que no és el que ens dóna els resultats desitjats.

Com veiem, el treball relacionat amb data, hora i idioma pot resultar problemàtic i no tenim més remei que fer proves fins a obtenir el resultat desitjat.

 

FUNCIÓ date_default_timezone_set PHP

La funció date_default_timezone_set és una funció PHP utilitzada per establir una zona horària específica com configuració local per al servidor. D'aquesta manera, podem fer que al demanar la data i hora actual ens mostri la data i hora d'un país (o regió d'un país) concret. La seva sintaxi és la següent:

date_default_timezone_set ($valorDeTimezone);

La configuració així establerta afectarà a totes les funcions de data i hora.

Els valors de $ valorDeTimezone han d'escollir-se entre els valors admesos. A la següent taula es mostren alguns d'ells (nota: alguns valors poden no ser reconeguts, recomanem fer proves per comprovar-ho):

Zones horàries per a Mèxic, Espanya i Argentina:

País

Zona

Zona

Zona

Mèxic

Amèrica/Mexico_City

America/Hermosillo

America/Matamoros

 

Amèrica/Cancun

Amèrica/Tijuana

Amèrica/Mazatlan

 

Amèrica/Merida

Amèrica/Santa_Isabel

Amèrica/Chihuahua

 

America/Monterrey

America/Bahia_Banderas

America/Ojinaga

Espanya

Europa/Madrid

Atlàntic/Canàries

 

Argentina

America/Argentina/Buenos_Aires

America/Argentina/Tucuman

America/Argentina/Mendoza

 

Amèrica/Argentina/Cordoba

America/Argentina/Catamarca

America/Argentina/San_Luis

 

America/Argentina/Salta

America/Argentina/La_Rioja

America/Argentina/Rio_Gallegos

 

America/Argentina/Jujuy

America/Argentina/San_Juan

America/Argentina/Ushuaia

 

Zones horàries per a altres països:

País

Zona

País

Zona

Colòmbia

Amèrica/Bogota

Hondures

America/Tegucigalpa

Veneçuela

America/Caracas

El Salvador

America/El_Salvador

Perú

Amèrica/Lima

Paraguai

Amèrica/Asuncion

Xile

Amèrica/Santiago a l'Pacífic/Pasqua

Nicaragua

Amèrica/Managua

Guatemala

Amèrica/Guatemala

Costa Rica

Amèrica/Costa_Rica

Equador

Amèrica/Guayaquil en o Pacífic/Galápagos

Port Ric

Amèrica/Puerto_Rico

Cuba

Amèrica/l'Havana

Panamà

Amèrica/Panamà

Bolívia

America/La_Paz

Uruguai

Amèrica/Montevideo

República Dominicana

Amèrica/Santo_Domingo

Guinea Equatorial

Àfrica/Malabo

 

 

Per provar el funcionament d'aquesta funció, en combinació amb setlocale, escriu aquest codi i comprova quins resultats obtens:

<Charset meta = "UTF-8">

<? Php

$mevaData=gmmktime(12,0,0,1,15,2089);

setlocale(LC_TIME, 'ca_ES.UTF-8');

echo 'Després de setlocale ca_ES.UTF-8 strftime torna:' .strftime ("% A,% d de% B de% I% H:% M", $mevaData). '<br/>';

echo 'Data real:'.strftime("% A,% d de% B% I% d'H:% M"). '<br/>';

date_default_timezone_set ("Europa/Madrid");

echo 'Establerta zona horària Europe/Madrid obtenim:' .strftime ("% A,% d de% B de% I% H:% M", $mevaData).'<br/>';

echo 'Ara data actual és:'.strftime ("% A,% d de% B de% I% H:% M"). '<br/>';

?>

El resultat que nosaltres hem obtingut amb un servidor ubicat a Denver (USA) és el següent:

Després de setlocale ca_ES.UTF-8 strftime retorna: dissabte 15 gener, 2089 05:00 
Data actual: dijous, setembre 4, 2044 04:31 
Establerta zona horària Europe/Madrid obtenim: dissabte 15 gener, 2089 13 : 00 
Ara data actual és: dijous, setembre 4, 2044 00:31

Fixa't com d'obtenir l'hora local a Denver hem passat a obtenir l'hora local a Madrid (8 hores avançada respecte a la de Denver) gràcies a l'ús de date_default_timezone_set.

No sempre s'obtenen els resultats desitjats, per la qual cosa és imprescindible realitzar proves.

 

EXERCICI 1

Crea una funció php de nom mostrarDiasMes que rebi com a arguments un mes (valor numèric d'1 a 12) i un any (valor numèric de 4 dígits) i mostri per pantalla el text "estès" corresponent a la data en idioma espanyol. Per exemple mostrarDiasMes (1, 2089) haurà de tornar: 1 gener 2089, 2 gener 2089, 3 gener 2089, 4 gener 2089 ... fins 31 gener 2089 ".