我正在开发一个网站,使用 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 月,则该部分不会打印任何内容,因此您将得到“2005”,而不是“2005 年 8 月”。

八月和九月的 elseif 语句的格式(据我所知)与其他语句完全相同,因此我不知道为什么这些值没有打印。如果我只是要求它打印 $which 值,它会打印为 08 或 09,并且这些值在数据库中看起来正确。我真的希望有一些简单的事情我忽略了,有人会很快指出,因为我已经在这个问题上用头撞墙很长一段时间了。

(我不确定这是否有任何区别,但我在 Joomla 中使用 Jumi 插件,它允许用户在 Joomla 页面中添加自定义代码来开发网站的这一部分。)

编辑:我刚刚删除了 08 和 09 中的 0,现在它们都正常显示了。所以我猜 现在的问题是,当正在检查的变量中的值为 08 和 09 时,为什么这可以解决问题?

另外,很抱歉在发布问题后这么快就解决了这个问题。

有帮助吗?

解决方案

是的,你必须删除你的条件的前导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;
}

其他提示

你正在使用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));

作为附带好处,如果您选择翻译您的网站,他甚至会将月份翻译成正确/使用过的语言。

让 MySQL 格式化日期 日期格式 并以您想要的方式将其返回给 PHP。这样,您就不需要使用 PHP 进行任何操作。

以下是您对 MySQL 进行的查询示例:

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

在哪里:

  • date_column 是原始表列,存储要格式化的日期,
  • %M 表示您希望完整拼写月份名称(“January”、“February”、“March”等),并且
  • %Y 表示您需要 4 位数的年份。

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     |
+-------------+----------------+

php中以0开头的数字是考虑的八进制。这可能是原因所在。把“和”放在一起他们周围。

但请阅读评论中的链接。这被认为是一种反模式。

这种方式确保它适用于所有语言环境,并且它使用很久很久以前为您编写的内容。

MySQL的:

select UNIX_TIMESTAMP(time) as unixtime from table;

PHP:

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

它还允许您重用$ row ['unixtime']变量,以便您可以以不同的方式格式化它或重用它,而无需在同一脚本中再次调用mysql。您甚至可以提供从常量或某些用户可配置选项到日期函数的不同字符串。

PHP有几个功能(从PHP 5.3起, DateTime type)处理时间和日期。

例如,在PHP 5.x中:

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

(包括strftime,因为它通常可以跨编程语言移植)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top