我正在使用PHP脚本在网站上工作,以显示从MySQL数据库以某种方式格式化的信息。我希望数据库中的日期值(格式为YYYY-MM-DD)显示为月YYYY。可能效率不高的代码我用来显示月份的单词如下:
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;
}
此代码显示第一部分的月份和年份。这完全显示在网页上,除非月份是8月或9月。如果月份是8月或9月,则该部分没有打印,因此不是“2005年8月”,而是“2005”。
8月和9月的elseif语句的格式(从我能说的)与其他语句完全相同,所以我不知道为什么这些值不打印。如果我只是要求它打印$ which值,它将打印为08或09,并且值在数据库中看起来正确。我真的希望有一些简单的东西,我忽略了有人会很快指出,因为我在这个问题上已经用了很长一段时间撞到了墙上。
(我不确定它是否有任何区别,但我在Joomla中使用Jumi插件,允许用户在Joomla页面中添加自定义代码以开发网站的这一部分。)
编辑:我刚从08和09删除了0,现在它们都显示正常。所以我想 现在的问题是为什么在正在检查的变量值为08和09的情况下这是否解决了问题?
此外,很抱歉在发布问题后不久就解决了这个问题。
答案 0 :(得分:3)
你正在使用Joomla! 1.5,对吗?为什么不让Joomla!做那件事:
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));
作为附带好处,如果您选择翻译您的网站,他甚至会将月份翻译成正确/使用过的语言。
答案 1 :(得分:2)
让MySQL使用date_format格式化日期并以您希望的方式将其返回给PHP。这样,您就不需要使用PHP进行任何操作。
以下是您将对MySQL进行的示例查询:
select date_format(date_column, '%M %Y') as formatted_date from table;
其中:
date_column中值为“2009-09-17”的字段将返回“2009年9月”
例如,以下输出显示原始date_column
值以及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 |
+-------------+----------------+
答案 2 :(得分:1)
php中以0开头的数字是考虑的八进制。这可能是原因所在。把“”放在他们身边。
但请阅读评论中的链接。这被认为是一种反模式。
答案 3 :(得分:1)
是的,你必须删除你的条件的前导0或php将其解释为八进制,你编码更好的方式
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;
}
答案 4 :(得分:1)
这种方式确保它适用于所有语言环境,并且它使用很久很久以前为您编写的内容。
MySQL的:
select UNIX_TIMESTAMP(time) as unixtime from table;
PHP:
$formatted_time = date('F Y', $row['unixtime']);
它还允许您重用$ row ['unixtime']变量,以便您可以以不同的方式格式化它或重用它,而无需在同一脚本中再次调用mysql。您甚至可以提供从常量或某些用户可配置选项到日期函数的不同字符串。
答案 5 :(得分:1)
PHP有几个函数(从PHP 5.3开始,DateTime类型)来处理时间和日期。
例如,在PHP 5.x中:
$mytime = strtotime($monthstart);
// $output_date = date("F Y", $mytime);
$output_date = strftime("%B %Y", $mytime);
(包括strftime,因为它通常可以跨编程语言移植)