Skip to content

Bug: Database dateFormat['datetime'] does not support millisecond or microsecond values #10540

Description

@daveherman71

PHP Version

8.4

CodeIgniter4 Version

4.7.4

CodeIgniter4 Installation Method

Composer (as dependency to an existing project)

Which operating systems have you tested for this bug?

Windows

Which server did you use?

cli-server (PHP built-in webserver)

Environment

development

Database

MySQL 8.4.9

What happened?

When setting the database connection in app\Config\Database.php, I am using the following dateFormat definition to get millisecond precision in my dates:

'dateFormat'   => [
    'date'     => 'Y-m-d',
    'datetime' => 'Y-m-d H:i:s.v',
    'time'     => 'H:i:s',
],

My model then configures the following for timestamps:

protected $useTimestamps = true;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';

After inserting an entry the table, the created_at column does not include the milliseconds. For example, the column has the value 2026-09-11 10:17:35 however because the column definition in MySQL is timestamp(6) the column should have the value 2026-09-11 10:17:35.509000.

Steps to Reproduce

Set the datetime mask as above and the model variables as above and insert a value into your table.

Expected Output

I expected the created_at column to include the milliseconds.

Anything else?

I have resolved this problem by overriding the setDate() function in the BaseModel as follows.

My model class is defined as:

class TransactionHistoryModel extends \App\Models\BaseModel {
...
}

I have then created my own BaseModel with the setDate override defined as:

namespace App\Models;

class BaseModel extends Model {

	/**
	 * Sets the timestamp or current timestamp if null value is passed.
	 *
	 * @param int|null $userDate An optional PHP timestamp to be converted
	 *
	 * @return int|string
	 *
	 * @throws ModelException
	 */
	protected function setDate(?int $userDate = null)
	{
		$currentDate = $userDate ? Time::createFromTimestamp($userDate) : Time::now();

		return $this->timeToDate($currentDate);
	}
}

This solution works.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugVerified issues on the current code behavior or pull requests that will fix them

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions