Domanda

Sto lavorando su un sito Web usando uno script PHP per visualizzare informazioni formattate in un certo modo da un database MySQL. Voglio che i valori della data dal database (che sono formattati come AAAA-MM-GG) vengano visualizzati come Mese AAAA. Il codice forse non abbastanza efficiente che sto usando per visualizzare i mesi come parole è sotto:

foreach($monthstart as $monthnext)
    {
    preg_match("/[[0-9][0-9]]*/", $monthnext, $startmonthfull);
    }
echo "<b>Duration: </b>";
foreach($startmonthfull as $which)
{
   if($which == 01)
{
echo "January ";
}
elseif($which == 02)
{
echo "February ";
}
elseif($which == 03)
{
echo "March ";
}
elseif($which == 04)
{
echo "April ";
}
elseif($which == 05)
{
  echo "May ";
}
elseif($which == 06)
{
  echo "June ";
}
elseif($which == 07)
{
  echo "July ";
}
elseif($which == 08)
{
  echo "August ";
}
elseif($which == 09)
{
  echo  "September ";
}
elseif($which == 10)
{
  echo "October ";
}
elseif($which == 11)
{
  echo "November ";
}
elseif($which == 12)
{
  echo "December ";
}
}
foreach($year as $printyear)
{
  echo $printyear;
}

Questo codice mostra il mese e l'anno per la prima parte. Questo viene visualizzato perfettamente sulla pagina Web, a meno che il mese non sia agosto o settembre. Se il mese è agosto o settembre, per quella parte non viene stampato nulla, quindi invece di "agosto 2005", otterrai "2005".

Le istruzioni elseif di agosto e settembre sono formattate (da quello che posso dire) esattamente come le altre, quindi non ho idea del perché questi valori non vengano stampati. Se gli chiedo semplicemente di stampare $ quale valore, stampa come 08 o 09 e i valori sembrano corretti nel database. Spero davvero che ci sia qualcosa di semplice che sto trascurando che qualcuno indicherà rapidamente perché ho battuto la testa contro il muro per un po 'di tempo con questo problema.

(Non sono sicuro che faccia differenza, ma sto usando il plugin Jumi in Joomla che consente agli utenti di aggiungere codice personalizzato in una pagina Joomla per sviluppare questa sezione del sito Web.)

MODIFICA: ho appena rimosso gli 0 da 08 e 09 e ora vengono visualizzati correttamente. Quindi immagino ora la domanda è: perché questo ha risolto il problema quando nella variabile che viene controllata i valori sono 08 e 09?

Inoltre, mi dispiace di averlo risolto così poco dopo aver pubblicato una domanda.

È stato utile?

Soluzione

sì, devi cancellare lo 0 iniziale sulla tua condizione o php lo interpreterebbe come ottale, codifichi meglio

foreach($monthstart as $monthnext){
    preg_match("/[[0-9][0-9]]*/", $monthnext, $startmonthfull);
}
echo "<b>Duration: </b>";
$monthArray = array(
1 => 'January',
2 => 'February',
3 => 'March',
4 => 'April',
5 => 'May',
6 => 'June',
7 => 'July',
8 => 'August',
9 => 'September',
10 => 'October',
11 => 'November',
12 => 'December');

foreach($startmonthfull as $which){
 echo($monthArray[$which] . " ");
}
foreach($year as $printyear)
{
  echo $printyear;
}

Altri suggerimenti

Stai usando Joomla! 1.5, giusto? Perché non lasciare che Joomla! fare che lavoro:

if (!defined('MY_DATE_FORMAT'))
   define('MY_DATE_FORMAT', '%B %Y');
jimport('joomla.utilities.date');

$mysql_date = '2009-08-01';

$jdate = new JDate($mysql_date);
echo $jdate->toFormat(JText::_(MY_DATE_FORMAT));

Come vantaggio collaterale, tradurrà anche il mese nella lingua corretta / usata se scegli di tradurre il tuo sito web.

Consenti a MySQL di formattare la data con date_format e restituiscilo a PHP come preferisci. In questo modo, non è necessario manipolare PHP.

Ecco una query di esempio che faresti a MySQL:

select date_format(date_column, '%M %Y') as formatted_date from table;

Dove:

  • date_column è la colonna della tabella originale che memorizza la data che si desidera formattare,
  • % M significa che vuoi che il nome del mese sia scritto per intero ('Gennaio', 'Febbraio', 'Marzo', ecc.) e
  • % Y significa che desideri l'anno a 4 cifre.

Un campo in date_column con valore "2009-09-17" verrà restituito come "Settembre 2009"

Ad esempio, il seguente output mostra i valori date_column originali insieme ai valori date_format () :

+-------------+----------------+
| date_column | formatted_date |
+-------------+----------------+
| 2009-09-11  | September 2009 |
| 2009-09-02  | September 2009 |
| 2009-09-01  | September 2009 |
| 2009-08-31  | August 2009    |
| 2009-08-04  | August 2009    |
| 2009-08-01  | August 2009    |
| 2009-07-11  | July 2009      |
| 2009-07-01  | July 2009      |
| 2009-06-30  | June 2009      |
| 2009-06-20  | June 2009      |
| 2009-06-09  | June 2009      |
| 2009-05-26  | May 2009       |
| 2009-05-09  | May 2009       |
| 2009-05-08  | May 2009       |
| 2009-04-22  | April 2009     |
| 2009-04-20  | April 2009     |
| 2009-04-19  | April 2009     |
| 2009-03-05  | March 2009     |
| 2009-03-04  | March 2009     |
| 2009-03-03  | March 2009     |
+-------------+----------------+

I numeri in php che iniziano con 0 sono considerati ottali. Questo potrebbe essere il motivo. Inserisci " " intorno a loro.

Ma leggi il link nel commento alla tua domanda. Questo è considerato un anti-pattern.

In questo modo garantisce che funzioni per tutti i locali e utilizza cose che sono state scritte per te molto, molto tempo fa.

mysql:

select UNIX_TIMESTAMP(time) as unixtime from table;

php:

$formatted_time = date('F Y', $row['unixtime']);

Permette anche di riutilizzare la variabile $ row ['unixtime'] in modo da poterla formattare in modi diversi o riutilizzarla senza richiamare mysql nello stesso script. Potresti anche fornire una stringa diversa da una costante o da alcune opzioni configurabili dall'utente alla funzione data.

PHP ha diverse funzioni (e a partire da PHP 5.3, DateTime type) per gestire orari e date.

Ad esempio, in PHP 5.x:

$mytime = strtotime($monthstart);
// $output_date = date("F Y", $mytime);
$output_date = strftime("%B %Y", $mytime);

(strftime è incluso perché è generalmente trasportabile attraverso linguaggi di programmazione)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top