PHP 6位数日期代码以人类可读的格式显示

时间:2017-01-23 15:20:30

标签: php

我有一组格式如下的日期......

197402
192201
184707

前四位数表示年份,其余两位数表示月份。我试图以这种格式输出这些

February 1974
January 1922
July 1847

我试过把它传递给像这样的日期函数......

echo date ('F Y', 197402)

但每次都给我 1970年1月所以我认为我误解了日期功能是如何运作的,有人可以帮忙吗?

5 个答案:

答案 0 :(得分:5)

你得到" 1970年1月"作为输出,因为你试图从 timestamp 197402创建一个日期,这是从1970年1月1日起的秒数。如果从那里输出完整的字符串(有秒和诸如此类) ,你会看到它是一个有效的时间戳,产生一个实际的日期,但它们都在1970年1月初结束,见online demo

这种格式,YYYYMM,对于大多数功能来说都不是一种可识别的格式。您需要将其拆分,如果您知道格式将以这种方式 - 并使用该数据。您可以使用substr()拆分字符串,然后在date()mktime()的帮助下将数字月份转换为与该月相关联的字符串(因为您只需指定年份和月)。

以下代码段

$arr = [197402, 192201, 184707];

foreach ($arr as $v) {
    $year   = substr($v, 0, 4);
    $month  = substr($v, 4, 2);
    echo date("F Y", mktime(0, 0, 0, $month, 0, $year))."<br />"; // mktime() produces a valid timestamp based on just month and year 

    // Alternatively, drop mktime() and use strtotime() and create from a standard format, 
    // while specifying a date in the month (which won't matter to the output)
    // echo date("F Y", strtotime("$month/01/$year"))."<br />";
}

将输出

  

1974年2月
  1922年1月   1847年7月

或者,您可以使用DateTime类(更简单使用),并使用date_create_from_format()

foreach ($arr as $v) {
    echo date_create_from_format('Yh', $v)->format('F Y')."<br />";
}

这将生成与上面相同的输出。

参考

答案 1 :(得分:4)

我使用DateTime class,您可以从特定格式创建,然后输出到另一个。

正如下面的评论中所指出的那样,您还需要将日期设置为该月的第一天,否则如果当前日期大于给定月份的天数,您将收到不需要的结果。

echo DateTime::createFromFormat('Ymd', 19470201)->format('F Y');

答案 2 :(得分:3)

当你传递一个int到目前为止,它正在考虑它作为Unix时间戳。 要从预定义格式创建日期对象,请使用DateTime::createFromFormat

echo DateTime::createFromFormat('Ym',198403)->format('F Y');

结果 March 1984

答案 3 :(得分:2)

您需要为其添加一天,例如只需添加&#34; 01&#34;然后使用strtotime将其转换为unix时间戳,因为date()函数需要时间戳作为参数。

e.g。

echo date('F Y', strtotime("19220101"));

答案 4 :(得分:1)

您可以使用非标准格式表示日期。首先,您必须解析它们并将它们转换为时间戳(自1970年1月1日00:00:00 UTC以来的秒数)。 PHP函数date()只能用于时间戳。

最佳方法(截至2017年)是将DateTime PHP类用于日期和时间。时间处理:

foreach (array('197402', '192201', '184707') as $text) {
    $date = DateTime::createFromFormat('Ym', $text);
    echo($date->format('F Y')."\n");
}

方法DateTime::createFromFormat()使用给定格式解析字符串,并在解析成功时创建新的DateTime对象。它的OOP等价于strtotime()但更聪明(因为它可以获得有关在输入字符串中搜索的日期组件的提示。)

方法DateTime::format()使用提供的格式生成日期的文本表示。它的OOP等价于date()

建议使用OOP方法(DateTime* classes)(并且比程序方法更好),因为它具有对时区的内置支持(程序日期时间函数缺少它)。