I'm trying to convert the string 18 December 2009 (Sweden) to 2009-12-18 but I can't figure out how. So I asking you now: how can I do this?
Thanks in advance.
You can use strtotime():
<?php
$sdate = '18 December 2009';
$timestamp = strtotime($sdate);
$d = date('Y-m-d', $timestamp);
echo "$d\n"; // 2009-12-18
If your problem is that the '(Sweden)' part is always present, you could just remove that part first:
<?php
$sdate = '18 December 2009 (Sweden)';
$sdate = preg_replace('/ \(.*\)$/', '', $sdate);
$timestamp = strtotime($sdate);
$d = date('Y-m-d', $timestamp);
echo "$d\n"; // 2009-12-18
Or with added checking:
<?php
$sdate = $oImdb->getReleaseDate();
if ($sdate !== 'n/A') {
$sdate = preg_replace('/ \(.*\)$/', '', $sdate);
$timestamp = strtotime($sdate);
$d = date('Y-m-d', $timestamp);
} else {
$d = 'n/a';
}
echo "$d\n"; // 2009-12-18
Or use sscanf():
<?php
$sdate = '18 December 2009 (Sweden)';
list($day, $month, $year) = sscanf($sdate, '%d %s %d');
$timestamp = strtotime("$day $month $year");
$d = date('Y-m-d', $timestamp);
echo "$d\n"; // 2009-12-18
I am not sure what you are doing there, but judging from the error message you wrote in your comment to JM above, I'd say you are approaching the problem from the wrong end. Quoting:
Thanks! When I try the function with $oIMDB->getReleaseDate() I get following error messages:
Fatal error: Uncaught exception 'Exception' with message DateTime::__construct() [datetime.--construct]: Failed to parse time string (<time itemprop="datePublished" datetime="2009-12-18">18 December 2009</time>) …
In other words, your getReleaseDate returns an XML string that has an attribute datetime with the value you are trying to convert the element value to. So, there is no need to convert anything, because the converted value is already there. All you have to do is use SimpleXml or DOM and access that attribute value, e.g.
$time = simplexml_load_string($oIMDB->getReleaseDate());
echo $time['datetime'];
First use Explode etc to remove the country name an store the Date and Country Name in separate strings, and then use strtotime
strtotime("18 December 2009")
strtotime(<String Variable containing date>)
It returns a timestamp, you can then use it as you want. See this for reference
Then use Date to convert the timestamp to date in the format you want.
There is also the PHP 5 DateTime object, which will allow you to capture time zones and convert time zones if start using times in addition to the date.
<?php
$sdate = '18 December 2009 (Sweden)';
$sdate = preg_replace('/ \(.*\)$/', '', $sdate);
$datetime = new DateTime($sdate, new DateTimeZone('UTC'));
echo $datetime->format('Y-m-d'); // 2009-12-18
The DateTime object will allow you to manipulate the date without any seconds arithmetic, which can be a reason to use DateTime instead of strtotime().
For example, this would add one month to your original date. Many benefits of the DateTime class.
$datetime->add(new DateInterval('P1M'));
Related
This question already has answers here:
Convert one date format into another in PHP
(17 answers)
Closed 1 year ago.
I am trying to convert a date from yyyy-mm-dd to dd-mm-yyyy (but not in SQL); however I don't know how the date function requires a timestamp, and I can't get a timestamp from this string.
How is this possible?
Use strtotime() and date():
$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));
(See the strtotime and date documentation on the PHP site.)
Note that this was a quick solution to the original question. For more extensive conversions, you should really be using the DateTime class to parse and format :-)
If you'd like to avoid the strtotime conversion (for example, strtotime is not being able to parse your input) you can use,
$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('d-m-Y');
Or, equivalently:
$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');
You are first giving it the format $dateString is in. Then you are telling it the format you want $newDateString to be in.
Or if the source-format always is "Y-m-d" (yyyy-mm-dd), then just use DateTime:
<?php
$source = '2012-07-31';
$date = new DateTime($source);
echo $date->format('d.m.Y'); // 31.07.2012
echo $date->format('d-m-Y'); // 31-07-2012
?>
Use:
implode('-', array_reverse(explode('-', $date)));
Without the date conversion overhead, I am not sure it'll matter much.
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);
This code works for every date format.
You can change the order of replacement variables such $3-$1-$2 due to your old date format.
$timestamp = strtotime(your date variable);
$new_date = date('d-m-Y', $timestamp);
For more, see the documentation for strtotime.
Or even shorter:
$new_date = date('d-m-Y', strtotime(your date variable));
Also another obscure possibility:
$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];
I don't know if I would use it but still :)
There are two ways to implement this:
1.
$date = strtotime(date);
$new_date = date('d-m-Y', $date);
2.
$cls_date = new DateTime($date);
echo $cls_date->format('d-m-Y');
Note: Because this post's answer sometimes gets upvoted, I came back
here to kindly ask people not to upvote it anymore. My answer is
ancient, not technically correct, and there are several better
approaches right here. I'm only keeping it here for historical
purposes.
Although the documentation poorly describes the strtotime function,
#rjmunro correctly addressed the issue in his comment: it's in ISO
format date "YYYY-MM-DD".
Also, even though my Date_Converter function might still work, I'd
like to warn that there may be imprecise statements below, so please
do disregard them.
The most voted answer is actually incorrect!
The PHP strtotime manual here states that "The function expects to be given a string containing an English date format". What it actually means is that it expects an American US date format, such as "m-d-Y" or "m/d/Y".
That means that a date provided as "Y-m-d" may get misinterpreted by strtotime. You should provide the date in the expected format.
I wrote a little function to return dates in several formats. Use and modify at will. If anyone does turn that into a class, I'd be glad if that would be shared.
function Date_Converter($date, $locale = "br") {
# Exception
if (is_null($date))
$date = date("m/d/Y H:i:s");
# Let's go ahead and get a string date in case we've
# been given a Unix Time Stamp
if ($locale == "unix")
$date = date("m/d/Y H:i:s", $date);
# Separate Date from Time
$date = explode(" ", $date);
if ($locale == "br") {
# Separate d/m/Y from Date
$date[0] = explode("/", $date[0]);
# Rearrange Date into m/d/Y
$date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
}
# Return date in all formats
# US
$Return["datetime"]["us"] = implode(" ", $date);
$Return["date"]["us"] = $date[0];
# Universal
$Return["time"] = $date[1];
$Return["unix_datetime"] = strtotime($Return["datetime"]["us"]);
$Return["unix_date"] = strtotime($Return["date"]["us"]);
$Return["getdate"] = getdate($Return["unix_datetime"]);
# BR
$Return["datetime"]["br"] = date("d/m/Y H:i:s", $Return["unix_datetime"]);
$Return["date"]["br"] = date("d/m/Y", $Return["unix_date"]);
# Return
return $Return;
} # End Function
You can try the strftime() function. Simple example: strftime($time, '%d %m %Y');
Given below is PHP code to generate tomorrow's date using mktime() and change its format to dd/mm/yyyy format and then print it using echo.
$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);
Use this function to convert from any format to any format
function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
$date_aux = date_create_from_format($from_format, $date);
return date_format($date_aux,$to_format);
}
In PHP any date can be converted into the required date format using different scenarios for example to change any date format into
Day, Date Month Year
$newdate = date("D, d M Y", strtotime($date));
It will show date in the following very well format
Mon, 16 Nov 2020
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));
function dateFormat($date)
{
$m = preg_replace('/[^0-9]/', '', $date);
if (preg_match_all('/\d{2}+/', $m, $r)) {
$r = reset($r);
if (count($r) == 4) {
if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]"; // Y-m-d
if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]"; // d-m-Y
if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]"; // m-d-Y
if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]"; //Y-m-d
}
$y = $r[2] >= 0 && $r[2] <= date('y') ? date('y') . $r[2] : (date('y') - 1) . $r[2];
if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$y-$r[1]-$r[0]"; // d-m-y
}
}
var_dump(dateFormat('31/01/00')); // return 2000-01-31
var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31
For this specific conversion we can also use a format string.
$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));
Obviously this won't work for many other date format conversions, but since we're just rearranging substrings in this case, this is another possible way to do it.
Simple way Use strtotime() and date():
$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));
With time
$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));
You can change the format using the date() and the strtotime().
$date = '9/18/2019';
echo date('d-m-y',strtotime($date));
Result:
18-09-19
We can change the format by changing the ( d-m-y ).
Use date_create and date_format
Try this.
function formatDate($input, $output){
$inputdate = date_create($input);
$output = date_format($inputdate, $output);
return $output;
}
In my CodeIgniter application, I am getting date in different formats, such as: April 1st 2017, May 29, 2015, Jun-15-2015, 10-September-2015 and sometimes even with extra string such as Start: April 1, 2017. However, I want to convert the input date from any format to Y-m-d in order to save it in MySQL database. For example, if input date is April 1st 2017 I should get 2017-04-01. I have used below posted code for that but it is not working for all of the above mentioned cases. So please tell how can I write general conversion logic that can convert date from any format even if date has extra string with it (as mentioned above) to Y-m-d format.
Code:
$date = DateTime::createFromFormat('F jS Y', $old_date);
$new_date = $date->format('Y-m-d');
try this
$old_date = 'Jun-15-2015';
echo $newDate = date("Y-m-d", strtotime($old_date));
You can replace the extra string like
$date = str_replace('Start: ',' ',$date);
And after you can use date function of php
echo $date = date('Y-m-d',strtotime($date));
This might help even for inserting this date format into database tables
function convertUTCCombinedToLocal($utcDateTime) {
$utcDateTime = explode(" ", $utcDateTime);
$date = explode("-", $utcDateTime[0]);
$time = explode(":", $utcDateTime[1]);
$localDate = new DateTime();
$localDate->setTimezone(new DateTimeZone('UTC'));
$localDate->setDate($date[0], $date[1], $date[2]);
if (count($time) == 3) {
$localDate->setTime($time[0], $time[1], $time[2]);
} else {
$localDate->setTime($time[0], $time[1], '00');
}
$localDate->setTimezone(new DateTimeZone('Asia/Kolkata'));
return $localDate->format('d/m/Y H:i:s');
}
I'm trying to extract just the day of the month from the dateTime formatted as follows:
$today = date('Y-m-d\TH:i:sP', strtotime('today'));
But, when I try extracting just the day of the month, I get '31'.
I'm using: $day = date('d', $today);
Which, I'm guessing, is incorrect.
This is because the second parameter to date() needs to be a Unix Timestamp. You're passing it string. As a result you get a date of Dec 31, 1969.
All of that code is unnecessary anyways as all you need is:
$day = day('d');
If you're going to only have access to the date string you must convert it to Unix Timestamp before passing it to date().
To extract days (or other parts of a datetime), I use the format function:
$datetime = new DateTime('2000-01-10', new DateTimeZone('Pacific/Nauru'));
$day = $datetime->format('d');
echo $day;
Use any format form the PHP Manual.
Hope this will solve your problem
$today = date('Y-m-d\TH:i:sP', strtotime('today'));
$day = date('d', strtotime($today)); // here is the difference,
// instead of $today use strtotime($today)
I am trying to create a function that determines the end date of an advert based on the start date and duration parameter passed by a user.
Example:
If user specify start date as 5th June 2013 and duration as 45 days:
$ad_startdate = '2013-06-05';
$ad_duration = 45;
The function should automatically get the end date which should be 20th July 2013:
$ad_end_date = '2013-07-20';
Pls note that to make it easy to generate the end date, I've assigned the variable for months a constant value which will be 30 days. Whether it's february or november or a leap year, every month has a fixed variable value of 30.
I was trying to come up with something around this but just cant figure it out.
$ad_startdate = '2013-06-05';
$ad_duration = 45;
// End date should be 2013-07-20
function getAdvertEndDate ($ad_startdate, $ad_duration){
//Add up start date with duration
$end_date = strtotime($ad_startdate) + $ad_duration;
return $end_date;
}
I have browsed through SO questions just to see if anyone has something around this but the answered ones are so different from mine challenge.
Would be very grateful getting help with this.
function getAdvertEndDate ($ad_startdate, $ad_duration){
return date("Y-m-d", strtotime($ad_startdate) + ($ad_duration * 86400));
}
Use like so:
$endDate = getAdvertEndDate("2013-04-08", 40);
PHP >= 5.3.0 Object oriented style
$date = DateTime::createFromFormat('Y-m-d', '2013-06-05');
$date->add(new DateInterval('P45D'));
echo $date->format('Y-m-d') . "\n";
Or Procedural style
$date = date_create('2013-06-05');
date_add($date, date_interval_create_from_date_string('45 days'));
echo date_format($date, 'Y-m-d');
Result:
2013-07-20
Code:
function getAdvertEndDate ($ad_startdate, $ad_duration){
$date = DateTime::createFromFormat('Y-m-d', $ad_startdate);
$date->add(new DateInterval('P'.$ad_duration.'D'));
return $date->format('Y-m-d');
}
For PHP < 5.3 use strtotime():
function getAdvertEndDate ($ad_startdate, $ad_duration){
//Add up start date with duration
return date('Y-m-d', strtotime($ad_startdate. " + $ad_duration days"));
}
echo getAdvertEndDate('2013-06-05', '45'); // 2013-07-20
http://www.php.net/manual/en/datetime.add.php
Try this code
$date = '2013-06-05';
$date1 = strtotime($date);
$date2 = strtotime('+45 day',$date1);
echo date('Y-m-d', $date2);
The native strtotime() function does this work.
Use this:
$ad_startdate = '2013-06-05';
$ad_duration = 45;
$dateArray = explode('-', $ad_startdate);
$newDate = date('Y-m-d', strtotime('+ ' . $ad_duration . ' days', mktime(0, 0, 0, $dateArray[1], $dateArray[2], $dateArray[0]));
If you're using strtotime, you cant use the date format you've specified, as if using - seperators, strtotime() expects the format differently.
From PHP.net
Note:
Dates in the m/d/y or d-m-y formats are disambiguated by looking at the separator between the various components: if the separator is a slash (/), then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.), then the European d-m-y format is assumed.
To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or DateTime::createFromFormat() when possible.
I am trying to parse date strings without having to manipulate strings and expect a given format.
I want my user to be able to enter January 2, 2011 or 1-2-11, and still end up with 2011-01-02 12:00:00 to save in a database.
Currently, I have this in place:
$post_date = date("Y-m-d H:i:s", strtotime(stripslashes($_POST['post_date'])));
But it seems strtotime is returning 0, because the datetime ends up as 1969-12-31 17:00:00
What do I need to change?
UPDATE
From php.net:
(PHP 4, PHP 5)
strtotime — Parse about any English textual datetime description into a Unix timestamp.
..I guess not!
I am not trying to strtotime( an array:
if(isset($_POST['post_date'])){
foreach($_POST['post_date'] as $id => $post_date){
print $post_date.'<br />';
if(strlen(trim($post_date)) && $post_date !== 'Date posted'){
$update_data[$id]['post_date'] = date("Y-m-d H:i:s", strtotime(stripslashes($post_date)));
}
}
}
Got it working with:
if(isset($_POST['post_date'])){
foreach($_POST['post_date'] as $id => $post_date){
print $post_date.'<br />';
if(strlen(trim($post_date)) && $post_date !== 'Date posted'){
$post_date = str_replace(',', '', $post_date);
$post_date = str_replace('-', '/', $post_date);
$update_data[$id]['post_date'] = date("Y-m-d H:i:s", strtotime(stripslashes($post_date)));
}
}
}
Thanks to multiple contributors. I remove commas and replace hyphens with forward slashes.
From the comments the OP said :
$_POST['post_date'] is actually an array (updating multiple records),
but an example value would be 'December 31, 2012'
You cannot pass a comma in the strtotime arguments alongside time, doing so would always return a 1970-01-01 00:00:00. You have to remove the user generated comma.
$post_date = date("Y-m-d H:i:s", strtotime(stripslashes("1 January 1927 17:59")));
echo $post_date; //1927-01-01 17:59:00
You really need to be concerned with your input, but here's an idea.
foreach($_POST['input'] as $userDate) {
// strtotime() will assume m/d/y or y-m-d depending on if '-' of '/' is used.
$userDate = str_replace('-', '/', $userDate);
$post_date = date("Y-m-d H:i:s", strtotime(stripslashes($userDate)));
}
In PHP 5.3.3+ (and perhaps older versions)
date('Y-m-d', strtotime('January 2, 2011'))
(notice the comma IS there) will give you 2011-01-02
However, when you add hour and minute to the end of that date phrase, strtotime DOES return 0.
date('Y-m-d', strtotime('January 2, 2011 14:30'))
Unfortunately gives you 1970-01-01 00:00:00
Notice: http://codepad.org/qgJIJSaw
Consider removing the comma:
$date = str_replace(',', '', $date);
Also, strtotime will convert '1-2-11' to 2001-02-11 (February 11th 2001), so you will probably need to rearrange the numbers if they fit the pattern, using something like:
$date = preg_replace('#^([\d]{1,2})-([\d]{1,2})-([\d]{2,4})$#', '$3-$1-$2', $date);