Date format version 3.3


#1

In cakephp 3.3 is there a way to set date format somewhere to yyyy-mm-dd the mysql standard? I have searched, and dug around in docs and config files.


#2

Set it where for what output? Have you looked at Time::setToStringFormat() ?


#3

Set it where for what output? Have you looked at Time::setToStringFormat() ?

Having come from java technologies many years ago, then php, then mvc then laravel, and after deciding laravel has gotton out of hand I figured I would try cakephp, it’s been around and is / should be stable. Next I decide to try the forum. I know of no other way to ask such a simple question.

Set it where

Config

for what output

yyyy-mm-dd as stated.

I wound up having to

date_format($row->lastedit, 'Y-m-d H:i:s') 

Now it would seem to me a framework as old and stable as cake would have a config setting to set how a date is to be displayed.


#4

Time::setToStringFormat() is a static method so you can call it anywhere, bootstrap.php for instance or in your AppController::beforeFilter if you have multi language site

http://api.cakephp.org/3.3/class-Cake.I18n.DateFormatTrait.html#_setToStringFormat
http://book.cakephp.org/3.0/en/core-libraries/time.html#setting-the-default-locale-and-format-string

just note it uses ICU format to format

http://book.cakephp.org/3.0/en/core-libraries/time.html#Cake\I18n\Time::i18nFormat


#5

From the api

setToStringFormat( string|array|integer $format )

That doesn’t tell me what to put for

  • string
  • array
  • I am guessing integer $format would be ‘Y-m-d H:i:s’

Why is it so hard in cakephp just to globally default to: Y-m-d H:i:s or Y-m-d if no time needed.
Or what format someone wants to set, why a silly class.

As another person stated, the docs can really leave you hanging, as there aren’t clear concise examples of some stuff.


#6

i see you didnt bother to check 2nd link
http://book.cakephp.org/3.0/en/core-libraries/time.html#setting-the-default-locale-and-format-string
which gives you examples

FrozenDate::setToStringFormat(\IntlDateFormatter::SHORT); // For any immutable Date

// The same method exists on Date, FrozenDate and FrozenTime
Time::setToStringFormat([
    \IntlDateFormatter::FULL,
    \IntlDateFormatter::SHORT
]);

// The same method exists on Date, FrozenDate and FrozenTime
Time::setToStringFormat('yyyy-MM-dd HH:mm:ss');

in bootstrap.php add
Time::setToStringFormat('yyyy-MM-dd HH:mm:ss');
which again is in link i gave, then in view you just do
<?= $row->lastedit ?> thats it and how hard was it?


#7

Putting

Time::setToStringFormat('yyyy-MM-dd HH:mm:ss');

only gives error

Error: Class 'Time' not found
File C:\Bitnami\wampstack-5.6.22-0\apache2\htdocs\cakephp\config\bootstrap.php
Line: 227 

This so called date time stuff in cake is a mess.


#8

you need to add path to the class otherwise PHP doesnt know which Time class you want to use, is it Cake\I18n\Time or some external lib class?
you can add use Cake\I18n\Time; to top of for instance bootstrap.php or Cake\I18n\Time::setToStringFormat anywhere, its not Cake problem http://php.net/manual/en/language.namespaces.php


#9

I added the use statement, now no error but still displaying like

9/23/16, 4:05 PM

I want

2016-09-23 16:05:48

#10

beyond that you need to supply some code cause it works for me


#11

bootstrap

use Cake\Network\Request;
use Cake\Utility\Inflector;
use Cake\Utility\Security;
use Cake\I18n\Time;

Bottom of bootstrap

Time::setToStringFormat('yyyy-MM-dd HH:mm:ss');

view

echo "<td style=\"width:40px;\">" . $row->lastedit . "</td>";

If however I do this

echo "<td style=\"width:40px;\">" . date_format($row->lastedit, 'Y-m-d H:i:s') . "</td>";

It is formatted correctly.


#12

and what type is $row->lastedit?


#13

It is a datetime field.


#14

then something is changing your output beetween bootstrap.php and your view code


#15
\Cake\I18n\Time::setToStringFormat('Y-m-d H:i:s');
\Cake\I18n\Date::setToStringFormat('Y-m-d');
\Cake\I18n\FrozenTime::setToStringFormat('Y-m-d H:i:s');
\Cake\I18n\FrozenDate::setToStringFormat('Y-m-d');

this maybe help


#16

@Diego thanks for reply, I wound up just doing

echo "<td style=\"width:40px;\">" . $row->lastedit->toDateTimeString() . "</td>";

Found it tucked away in a trait. Wasn’t in the docs, I created an issue and they are adding it to docs. I was hoping there was a global setting to change the format to Y-m-d H:i:s for datetime, but I guess there is not a config setting for it. Naturally I could always format with php like:

echo "<td style=\"width:40px;\">" . date_format($row->lastedit, 'Y-m-d H:i:s') . "</td>";

But since I am using cake I figured I’d try their way.

See Chronos FormattingTrait