Formatting DateTime object, respecting Locale::getDefault()

PhpDatetime Format

Php Problem Overview


I have a DateTime object which I'm currently formating via

$mytime->format("D d.m.Y")

Which gives me exactly the format I need: >Tue 5.3.2012

The only missing point is the correct language. I need German translation of Tue (Tuesday), which is Die (Dienstag).

This gives me the right locale setting

Locale::getDefault()

But I don't know how to tell DateTime::format to use it.

Isn't there a way to do something like:

$mytime->format("D d.m.Y", \Locale::getDefault());

Php Solutions


Solution 1 - Php

You can use the Intl extension to format the date. It will format dates/times according to the chosen locale, or you can override that with IntlDateFormatter::setPattern().

A quicky example of using a custom pattern, for your desired output format, might look like.

$dt = new DateTime;

$formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
$formatter->setPattern('E d.M.yyyy');

echo $formatter->format($dt);

Which outputs the following (for today, at least).

> Di. 4.6.2013

Solution 2 - Php

That's because format does not pay attention to locale. You should use strftime instead.

For example:

setlocale(LC_TIME, "de_DE"); //only necessary if the locale isn't already set
$formatted_time = strftime("%a %e.%l.%Y", $mytime->getTimestamp())

Solution 3 - Php

While setlocale() is the correct answer and will still work but is outdated now.

> strftime has been DEPRECATED as of PHP 8.1.0 Relying on this function is highly discouraged.

And mentioned Intl extension works perfectly, but not always handy.

One of the simplest ways to work with dates and times is to use Carbon2, CakePHP Chronos or similar library. It provides a single interface to all date's manipulations, formatting, and calculations. If you work with dates a lot I recommend using Carbon and then doing something like this

$date = Carbon::now()->locale('fr_FR');
echo $date->isoFormat('dd DD.MM.YYYY');  

Please note that the format differs from the date() one. Full list see in Carbon docs but mentioned D d.m.Y can be something like dd DD.MM.YYYY.

If your project accepts 3rd party libraries, it's really the way to go. Also, if you're using the framework, please check, maybe Carbon (or its wrapper) is already included.

Solution 4 - Php

This is how I solved combining the features of DateTime and strftime().

The first allows us to manage strings with a weird date format, for example "Ymd" (stored in db from a datepicker). The second allows us to translate a date string in some language.

For example we start from a value "20201129", and we want end with an italian readable date, with the name of day and month, also the first letter uppercase: "Domenica 29 novembre 2020".

// for example we start from a variable like this
$yyyymmdd = '20201129';

// set the local time to italian
date_default_timezone_set('Europe/Rome');
setlocale(LC_ALL, 'it_IT.utf8');

// convert the variable $yyyymmdd to a real date with DateTime
$truedate = DateTime::createFromFormat('Ymd', $yyyymmdd);

// check if the result is a date (true) else do nothing
if($truedate){

  // output the date using strftime
  // note the value passed using format->('U'), it is a conversion to timestamp
  echo ucfirst(strftime('%A %d %B %Y', $truedate->format('U')));

}

// final result: Domenica 29 novembre 2020

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionstoeflnView Question on Stackoverflow
Solution 1 - PhpsalatheView Answer on Stackoverflow
Solution 2 - PhpJonathanView Answer on Stackoverflow
Solution 3 - PhpYaroslavView Answer on Stackoverflow
Solution 4 - PhpzodView Answer on Stackoverflow