Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP 6 digit date code display in human readable format

Tags:

php

I have a set of dates that are formatted like this...

197402
192201
184707

The first four digits represents the year and the remaining two the month. I am trying to output these in this format

February 1974
January 1922
July 1847

I have tried passing it to the date function like this...

echo date ('F Y', 197402)

But this is giving me January 1970 everytime so I assume I have misunderstood how the date function works, can anyone help?

like image 784
fightstarr20 Avatar asked Jan 23 '17 15:01

fightstarr20


People also ask

How to get the German number format in PHP?

[EDIT BY danbrown AT php DOT net: The original note follows.] return number_format($inp, 2, ',', '.'); you can get the German format 1.234,56. (Comma as decimal separator and point as thousand separator)

What does the date_format() function return?

The date_format () function returns a date formatted according to the specified format. Note: This function does not use locales (all output is in English). Tip: Also look at the date () function, which formats a local date/time. Required. Specifies a DateTime object returned by date_create () Required. Specifies the format for the date.

What is the format of the output date string?

The format of the outputted date string. See the formatting options below. There are also several predefined date constants that may be used instead, so for example DATE_RSS contains the format string 'D, d M Y H:i:s' . st, nd, rd or th.

Why can't I use the U format character in the date_format () function?

Since this function only accepts int timestamps the u format character is only useful when using the date_format () function with user based timestamps created with date_create () . Returns the formatted date string on success.


2 Answers

You're getting "January 1970" as an output, because you tried to create a date from the timestamp 197402, which is seconds from January 1st, 1970. If you output the full string from that (with seconds and whatnot), you'll see it's a valid timestamp, producing an actual date, but they all end up in the start of January 1970, see this online demo.

That format, YYYYMM, isn't a recognizable format for most functions. You need to split it up, if you know the format will be in that way - and use that data instead. You can use substr() to split the string, and then convert the numerical month to the string associated with that month, with the help of date() and mktime() (since you just specify the year and month).

The following snippet

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

will output

February 1974
January 1922
July 1847


Alternatively, you can use the DateTime class (which is a lot simpler to work with), and create from a given format with date_create_from_format()

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

This will generate the same output as above.

References

  • http://php.net/substr
  • http://php.net/mktime
  • http://php.net/date
  • http://php.net/datetime.createfromformat
like image 101
Qirel Avatar answered Oct 13 '22 00:10

Qirel


I'd use the DateTime class, you can create from a specific format, and then output to another.

As pointed out in the comments below, you also need to set the day to the first of the month, otherwise you'll get undesired results if the current day is greater than the number of days in the given month.

echo DateTime::createFromFormat('Ymd', 19470201)->format('F Y');
like image 35
billyonecan Avatar answered Oct 13 '22 00:10

billyonecan