MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME .) By default, the current time zone for each connection is the server's time.
The toISOString() method returns a string in simplified extended ISO format (ISO 8601), which is always 24 or 27 characters long ( YYYY-MM-DDTHH:mm:ss. sssZ or ±YYYYYY-MM-DDTHH:mm:ss. sssZ , respectively). The timezone is always zero UTC offset, as denoted by the suffix Z .
MySQL DATE is one of the five temporal data types used for managing date values. MySQL uses yyyy-mm-dd format for storing a date value. This format is fixed and it is not possible to change it.
MySQL comes with the following data types for storing a date or a date/time value in the database: DATE - format YYYY-MM-DD. DATETIME - format: YYYY-MM-DD HH:MI:SS.
I think that keeping your date-time values in field of type DATETIME
would be kind of natural way.
From my own experience with my current PHP application, only read
/ write
operations concerning this information may be problematic.
One of possible solutions (assuming that you use DATETIME
data type) for properly performing the whole process could be the following approach:
DATETIME
fields from your database converting them in the query to string representation in the form of '2011-10-02T23:25:42Z'
by using DATE_FORMAT
MySQL function with '%Y-%m-%dT%H:%i:%sZ'
formatting string (docs on DATE_FORMAT)DateTime
class objects and DateTime::createFromFormat
static method given 'Y-m-d\TH:i:s\Z'
formatting string (T
and Z
are escaped to avoid treating them as formatting directives) (docs for the method).DateTime
class object to our ISO 8601 in UTC format string representation using DateTime
class object's format
method with the same as before 'Y-m-d\TH:i:s\Z'
formatting string (documentation).INSERT
/ UPDATE
operation on database information using such prepared string as a parameter for MySQL function STR_TO_DATE
(with '%Y-%m-%dT%H:%i:%sZ'
formatting string) which converts it to real database DATETIME
value (docs on STR_TO_DATE).Below please find a draft example of such approach using PDO objects:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
This approach helped me a lot in operating date-time values between PHP and MySQL database.
I hope it might occur helpful for you also.
You can use DateTime
data type for storing the date and time.
Use CAST
function to cast such strings into mysql DateTime
type.
Here is an example:
CAST("2011-10-02T23:25:42Z" AS DATETIME)
This will give you 2011-10-02 23:25:42
.
Hope this will help you.
You can easily convert the date using strtotime
function of php
:
date_default_timezone_set('UTC');
$date = '2011-10-02T23:25:42Z';//(aka ISO 8601 in UTC)
$time = strtotime($date); //time is now equals to the timestamp
$converted = date('l, F jS Y \a\t g:ia', $time); //convert to date if you prefer, credit to Marc B for the parameters
Now you would simply insert your date in MySQL
using timestamp
or datetime
depending on which one fit the most your needs. Here the most important things you should know about both types.
Timestamp
on update current_timestamp
on columns for all versions.NULL
is not a possible default valueUTC
for storage, and converted back from UTC
to the current time-zone for retrieval.Datetime
5.6.5
Which is best for comparison (eg. getting records between two dates/times) and ordering the results from queries? What about if the database is very large?
According to the previous points I stated, then you should use timestamp
for a very large database as the storage is smaller, and the index faster which will give you better performance for comparison. However, you MUST MAKE SURE your date will fit the limits of the timestamp
I previously mentioned, else you have no choice and must use datetime
.
Documentation for strtotime
: http://php.net/manual/en/function.strtotime.php
And please, for the sake of SO's answerer who keep repeating every day to not use the mysql*
DEPRECATED functions, please use PDO
or mysqli*
when you will do your inserts.
http://php.net/manual/en/book.pdo.php
http://php.net/manual/en/book.mysqli.php
You can not store date in raw UTC ISO8601 format (with 2011-10-02T23:25:42Z
representation) and save all SQL DATETIME functionality.
But you should know, that MySQL ( regarding to http://dev.mysql.com/doc/refman/5.5/en/datetime.html ) always store time/date in UTC. Also you can modify timezone for your connection http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
So, if you execute in PHP
date_default_timezone_set('UTC');
and in MySQL
SET time_zone = +00:00
sure PHP and MySQL would use UTC.
After that you can convert all database strings to DateTime without caring about timezone mismatch.
To convert any PHP DateTime (without carrying about its internal timezone) to MySQL datetime string you should set DateTime object timezone to UTC.
$datetime->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s');
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With