{"id":56043,"date":"2022-06-08T03:01:51","date_gmt":"2022-06-07T17:01:51","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=56043"},"modified":"2022-06-07T16:14:54","modified_gmt":"2022-06-07T06:14:54","slug":"php-date-difference-current-time-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/php-date-difference-current-time-tutorial\/","title":{"rendered":"PHP Date Difference Current Time Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"PHP Date Difference Current Time Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off_ct.jpg\" title=\"PHP Date Difference Current Time Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">PHP Date Difference Current Time Tutorial<\/p><\/div>\n<p>Today&#8217;s progress onto the start of yesterday&#8217;s <a title='PHP Date Difference Primer Tutorial' href='#phpddpt'>PHP Date Difference Primer Tutorial<\/a> is to allow the user &#8230;<\/p>\n<ul>\n<li>pick a Timezone name (or hour offset from GMT) from left hand dropdown(s)<\/li>\n<li>allow for a new option (off the hardcoded &#8220;Time&#8221; in that new dropdown) called &#8220;Is Currently&#8221; filling the date and time fields with relevant current date and time<\/li>\n<\/ul>\n<p> &#8230; the methodology of making this happen showing the smarts of the same HTML iframe element in two guises, as &#8230;<\/p>\n<ul>\n<li>target element of a form (method GET or POST) &#8230; or &#8230;<\/li>\n<li>ahead of the submit button pressing to make above happen, an interim usage whereby reassign its &#8220;src&#8221; attribute <font color=blue>with GET arguments<\/font> facilitates &#8230;<br \/>\n&lt;?php<br \/>\n<code><br \/>\n\/**    Returns the offset from the origin timezone to the remote timezone, in seconds.<br \/>\n*    @param $remote_tz;<br \/>\n*    @param $origin_tz; If null the servers current timezone is used as the origin.<br \/>\n*    @return int;<br \/>\n*\/<br \/>\nfunction get_timezone_offset($remote_tz, $origin_tz = null) { \/\/ thanks to https:\/\/www.php.net\/manual\/en\/function.timezone-offset-get.php<br \/>\n    if($origin_tz === null) {<br \/>\n        if(!is_string($origin_tz = date_default_timezone_get())) {<br \/>\n            return false; \/\/ A UTC timestamp was returned -- bail out!<br \/>\n        }<br \/>\n    }<br \/>\n    $origin_dtz = new DateTimeZone($origin_tz);<br \/>\n    $origin_dt = new DateTime(\"now\", $origin_dtz);<br \/>\n    if (strpos(str_replace('GMT','\/',str_replace('UTC','\/',$remote_tz)), '\/') === false) {<br \/>\n    $offset = (trim(str_replace('+','',urldecode($remote_tz))) * 60 * 60);<br \/>\n    if (strpos(('' . $offset),'-') !== false) {<br \/>\n    $origin_dt-&gt;sub(new DateInterval('PT' . str_replace('-','',('' . $offset)) . 'S'));<br \/>\n    } else {<br \/>\n    $origin_dt-&gt;add(new DateInterval('PT' . $offset . 'S'));<br \/>\n    }<br \/>\n    <font color=blue>$rts=$origin_dt-&gt;format('Ymd:His');<br \/>\n    if (isset($_GET['rightnowstart'])) {<br \/>\n      echo \"&lt;html&gt;&lt;body onload=\\\"parent.document.getElementById('datestart').value='\" . $rts . \"'; parent.document.getElementById('yyyydatestart').value='\" . substr($rts,0,4) . \"';  parent.document.getElementById('ommdatestart').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('ommdatestart').innerHTML='\" . substr($rts,4,2) . \"'; parent.document.getElementById('mmdatestart').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('odddatestart').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('odddatestart').innerHTML='\" . substr($rts,6,2) . \"';  parent.document.getElementById('dddatestart').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('ohhdatestart').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('ohhdatestart').innerHTML='\" . substr($rts,9,2) . \"';  parent.document.getElementById('hhdatestart').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('omidatestart').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('omidatestart').innerHTML='\" . substr($rts,11,2) . \"';  parent.document.getElementById('midatestart').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('ossdatestart').value='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ossdatestart').innerHTML='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ssdatestart').value='\" . substr($rts,13,2) . \"'; \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n      exit;<br \/>\n    }<br \/>\n    if (isset($_GET['rightnowend'])) {<br \/>\n      echo \"&lt;html&gt;&lt;body onload=\\\"parent.document.getElementById('dateend').value='\" . $rts . \"'; parent.document.getElementById('yyyydateend').value='\" . substr($rts,0,4) . \"';  parent.document.getElementById('ommdateend').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('ommdateend').innerHTML='\" . substr($rts,4,2) . \"'; parent.document.getElementById('mmdateend').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('odddateend').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('odddateend').innerHTML='\" . substr($rts,6,2) . \"';  parent.document.getElementById('dddateend').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('ohhdateend').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('ohhdateend').innerHTML='\" . substr($rts,9,2) . \"';  parent.document.getElementById('hhdateend').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('omidateend').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('omidateend').innerHTML='\" . substr($rts,11,2) . \"';  parent.document.getElementById('midateend').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('ossdateend').value='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ossdateend').innerHTML='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ssdateend').value='\" . substr($rts,13,2) . \"'; \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n      exit;<br \/>\n    }<\/font><br \/>\n    } else {<br \/>\n    $remote_dtz = new DateTimeZone($remote_tz);<br \/>\n    $remote_dt = new DateTime(\"now\", $remote_dtz);<br \/>\n    if (strpos($remote_tz, '\/Hovd') !== false && strpos($origin_tz, 'GMT') !== false && $offset &lt; 0) {<br \/>\n      $offset=-$offset;<br \/>\n      $remote_dt-&gt;add(new DateInterval('PT' . ('' . $offset) . 'S'));<br \/>\n      $remote_dt-&gt;add(new DateInterval('PT' . ('' . $offset) . 'S'));<br \/>\n    }<br \/>\n    <font color=blue>$rts=$remote_dt-&gt;format('Ymd:His');<br \/>\n    if (isset($_GET['rightnowstart'])) {<br \/>\n      echo \"&lt;html&gt;&lt;body onload=\\\"parent.document.getElementById('datestart').value='\" . $rts . \"'; parent.document.getElementById('yyyydatestart').value='\" . substr($rts,0,4) . \"';  parent.document.getElementById('ommdatestart').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('ommdatestart').innerHTML='\" . substr($rts,4,2) . \"'; parent.document.getElementById('mmdatestart').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('odddatestart').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('odddatestart').innerHTML='\" . substr($rts,6,2) . \"';  parent.document.getElementById('dddatestart').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('ohhdatestart').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('ohhdatestart').innerHTML='\" . substr($rts,9,2) . \"';  parent.document.getElementById('hhdatestart').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('omidatestart').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('omidatestart').innerHTML='\" . substr($rts,11,2) . \"';  parent.document.getElementById('midatestart').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('ossdatestart').value='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ossdatestart').innerHTML='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ssdatestart').value='\" . substr($rts,13,2) . \"'; \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n      exit;<br \/>\n    }<br \/>\n    if (isset($_GET['rightnowend'])) {<br \/>\n      echo \"&lt;html&gt;&lt;body onload=\\\"parent.document.getElementById('dateend').value='\" . $rts . \"'; parent.document.getElementById('yyyydateend').value='\" . substr($rts,0,4) . \"';  parent.document.getElementById('ommdateend').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('ommdateend').innerHTML='\" . substr($rts,4,2) . \"'; parent.document.getElementById('mmdateend').value='\" . substr($rts,4,2) . \"';  parent.document.getElementById('odddateend').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('odddateend').innerHTML='\" . substr($rts,6,2) . \"';  parent.document.getElementById('dddateend').value='\" . substr($rts,6,2) . \"';  parent.document.getElementById('ohhdateend').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('ohhdateend').innerHTML='\" . substr($rts,9,2) . \"';  parent.document.getElementById('hhdateend').value='\" . substr($rts,9,2) . \"';  parent.document.getElementById('omidateend').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('omidateend').innerHTML='\" . substr($rts,11,2) . \"';  parent.document.getElementById('midateend').value='\" . substr($rts,11,2) . \"';  parent.document.getElementById('ossdateend').value='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ossdateend').innerHTML='\" . substr($rts,13,2) . \"';  parent.document.getElementById('ssdateend').value='\" . substr($rts,13,2) . \"'; \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n      exit;<br \/>\n    }<\/font><br \/>\n    $offset = $origin_dtz-&gt;getOffset($origin_dt) - $remote_dtz-&gt;getOffset($remote_dt);<br \/>\n    if (strpos($remote_tz, '\/Hovd') !== false && strpos($origin_tz, 'GMT') !== false && $offset &lt; 0) { $offset=-$offset; }<br \/>\n    }<br \/>\n    return ($offset \/ 3600);<br \/>\n}<br \/>\n<br \/>\n<font color=blue>if (isset($_GET['rightnowstart'])) {<br \/>\n  get_timezone_offset(str_replace('+','_',str_replace('%20','_',urldecode($_GET['rightnowstart']))),'GMT');<br \/>\n} else if (isset($_GET['rightnowend'])) {<br \/>\n  get_timezone_offset(str_replace('+','_',str_replace('%20','_',urldecode($_GET['rightnowend']))),'GMT');<br \/>\n}<\/font><br \/>\n<\/code><br \/>\n?&gt;\n<\/li>\n<\/ul>\n<p> &#8230; <a target=_blank title='?' href='https:\/\/www.youtube.com\/watch?reload=9&#038;v=iiATDMHU7gc'>but there&#8217;s more<\/a>!<\/p>\n<p>Think iframe, also think &#8230;<\/p>\n<ul>\n<li>&#8220;onload&#8221; Javascript event functionality that might feed into <a target=_blank title=\"Client Pre-emptive Iframe\" href='https:\/\/www.rjmprogramming.com.au\/ITblog\/?s=%22Client+Pre-emptive+Iframe%22'>&#8220;Client Pre-emptive Iframe&#8221;<\/a> (suck it and see) ideas<\/li>\n<li>&#8220;srcdoc&#8221; populate &#8220;entire HTML content&#8221; thinking<\/li>\n<\/ul>\n<p>Again, feel free to try <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php-GETME\">our changed<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php-GETME\">&#8220;proof of concept&#8221;<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php\">PHP web application<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=_blank  href='\/\/www.rjmprogramming.com.au\/ITblog\/php-date-difference-current-time-tutorial\/'>PHP Date Difference Current Time Tutorial<\/a>.<\/p-->\n<hr>\n<p id='phpddpt'>Previous relevant <a target=_blank title='PHP Date Difference Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/php-date-difference-primer-tutorial\/'>PHP Date Difference Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"PHP Date Difference Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.jpg\" title=\"PHP Date Difference Primer Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">PHP Date Difference Primer Tutorial<\/p><\/div>\n<p>When you think of Timezones, do you think of datetime differences?<\/p>\n<p>Okay, well <i>some<\/i> people must <font size=1>&#8230; surely?<\/font>  Anyway, we do.  We wonder, thinking about other people in the wooooorrrrllllddd, what time is it for them?  Even, what day is it for them, the International Dateline blowing my tiny little mooooiiinnnnddd!<\/p>\n<p>And so we wrote some PHP code to help with <i>datetime differences<\/i> whether they be related to Timezones or not.  We designed a PHP web application that always starts with a defined &#8220;Start Datetime&#8221; and then allows either &#8230;<\/p>\n<ol>\n<li>End Datetime (deriving Datetime Difference) &#8230; or &#8230;<\/li>\n<li>Datetime Difference (deriving End Datetime)<\/li>\n<\/ol>\n<p> &#8230; modes of use.  Simple, huh?!  And yet, even here, with that first scenario, a pretty fundamental thing was learnt, by yours truly, undertaking this exercise.  A <i>Datetime Difference<\/i> result is only useful to the &#8220;Day&#8221; point because any one &#8220;Month&#8221; can be a different length of time to another, and so, becomes difficult to express in terms of a &#8220;Month Difference&#8221;.<\/p>\n<p>Feel free to try our <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php_GETME\">&#8220;proof of concept&#8221;<\/a> <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/away_off.php\">PHP web application<\/a>.<\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d56030' onclick='var dv=document.getElementById(\"d56030\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/date\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d56030' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d56043' onclick='var dv=document.getElementById(\"d56043\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/iframe\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d56043' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Today&#8217;s progress onto the start of yesterday&#8217;s PHP Date Difference Primer Tutorial is to allow the user &#8230; pick a Timezone name (or hour offset from GMT) from left hand dropdown(s) allow for a new option (off the hardcoded &#8220;Time&#8221; &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/php-date-difference-current-time-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,14,1,37],"tags":[2078,301,3988,2139,367,452,587,849,932,3989,1986,1279,1693,1319],"class_list":["post-56043","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-uncategorised","category-tutorials","tag-constructor","tag-date","tag-date-difference","tag-difference","tag-dropdown","tag-form","tag-iframe","tag-object","tag-php","tag-programmming","tag-proof-of-concept","tag-time","tag-timezone","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/56043"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=56043"}],"version-history":[{"count":3,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/56043\/revisions"}],"predecessor-version":[{"id":56046,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/56043\/revisions\/56046"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=56043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=56043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=56043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}