【问题标题】:PHP 6 digit date code display in human readable formatPHP 6 位日期代码以人类可读格式显示
【发布时间】:2017-01-23 15:20:30
【问题描述】:

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

197402
192201
184707

前四位数字代表年份,其余两位代表月份。我正在尝试以这种格式输出这些

February 1974
January 1922
July 1847

我已经尝试将它传递给这样的日期函数...

echo date ('F Y', 197402)

但这每次都给我 1970 年 1 月,所以我认为我误解了日期函数的工作原理,有人可以帮忙吗?

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

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

    【讨论】:

    • 当当前日期为 2 月 29 日(闰年)时,此答案将不起作用,因为 DateTime::createFromFormat 将日期部分默认为当前日期。当我的系统时间为 2004-02-29 时,您的示例给了我March 1947
    • 好点,这可以通过在createFromFormat 或调用setDate 方法中将日期设置为每月的第一天来纠正
    【解决方案2】:

    您将得到“1970 年 1 月”作为输出,因为您尝试从 时间戳 197402 创建一个日期,即 1970 年 1 月 1 日的秒数。如果您输出完整从那个字符串(包括秒和诸如此类),你会看到它是一个有效的时间戳,产生一个实际的日期,但它们都在 1970 年 1 月开始,见online demo

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

    下面的sn-p

    $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 />";
    }
    

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

    参考文献

    【讨论】:

      【解决方案3】:

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

      例如

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

      【讨论】:

        【解决方案4】:

        当您将 int 传递到日期时,它会将其视为 Unix 时间戳。 要从预定义格式创建日期对象,请使用 DateTime::createFromFormat

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

        导致 March 1984

        【讨论】:

        • 当当前日期是 2 月 29 日(闰年)并且您正在格式化的日期也是 2 月时,此答案 may not work
        【解决方案5】:

        您有非标准格式的日期文本表示。首先,您必须解析它们并将它们转换为时间戳(自 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 对象。它是 strtotime() 的 OOP 等价物,但更智能(因为它可以提示要在输入字符串中搜索哪些日期组件。)

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

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

        【讨论】:

          猜你喜欢
          • 2012-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 2018-04-18
          • 2014-05-30
          • 2017-04-24
          • 2017-04-03
          相关资源
          最近更新 更多