Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Output Previous Weekday from Input Like "030507" (March 5, 2007)

Posted on 2007-03-23
9
286 Views
Last Modified: 2008-03-06
How to output the previous weekday?  
     If user inputs "030507" (Monday, March 5, 2007), I want to output "030207" (Friday, March 2, 2007), skipping back past Sunday and Saturday.  
     But if the user inputs "030607" (Tuesday, March 6, 2007), I want to output "030507" (Monday, March 5, 2007).
0
Comment
Question by:Randall-B
  • 6
  • 3
9 Comments
 
LVL 24

Accepted Solution

by:
glcummins earned 250 total points
ID: 18782664
<?php

$input = "030507";

$inputMonth = substr($input, 0, 2);
$inputDay = substr($input, 2, 2);
$inputYear = substr($input, 4, 2);

$timestamp = mktime(0, 0, 0, $inputMonth, $inputDay, $inputYear);

getPreviousWeekday($timestamp);

function getPreviousWeekday($timestamp)
{
        // This function is called recursively until a weekday is found
      $previousDay = $timestamp - 86400; // Substract one day of seconds (24 hours x 60 minutes x 60 seconds)
      if (6 > date('N', $previousDay))
      {
            
            $previousWeekday = date('mdy', $previousDay);
            print "$previousWeekday<br />";
      }
      else
      {
            getPreviousWeekday($previousDay);
      }
}

?>
0
 

Author Comment

by:Randall-B
ID: 18782962
Great.  It works fine as a stand-alone script.  But then I combined it with another (which may look familiar to you), so it will echo each weekday of a given month, and also the previous weekday.
  In that situation it gives this error: Fatal error: Call to undefined function getpreviousweekday() .   Here is the complete script that I'm testing:

<?php

$inputDate = "March, 2007";

list($inputMonth, $inputYear) = explode(', ', $inputDate);

$daysInMonth = date('t', strtotime("$inputMonth $inputYear"));

for ($i=1; $i<=$daysInMonth; $i++)
{
      if (6 > date('N', strtotime("$i $inputMonth $inputYear")))
      {
         $weekday = date('mdy', strtotime("$i $inputMonth $inputYear"));

    ////////////  Get previous weekday /////////

            $inputMonth = substr($weekday, 0, 2);
            $inputDay = substr($weekday, 2, 2);
            $inputYear = substr($weekday, 4, 2);

           $timestamp = mktime(0, 0, 0, $inputMonth, $inputDay, $inputYear);

           getPreviousWeekday($timestamp);

           function getPreviousWeekday($timestamp) {
        // This function is called recursively until a weekday is found
           $previousDay = $timestamp - 86400; // Substract one day of seconds (24 hours x 60 minutes x 60 seconds)
             
                   if (6 > date('N', $previousDay)) {
           
                $previousWeekday = date('mdy', $previousDay);
                print "$previousWeekday<br />";
            } else {
               getPreviousWeekday($previousDay);
           }
        }
                  
       /////// END of get previous weekday //////////


          echo "<tr><td>$weekday $previousweekday</td></tr>";
      }
}
?>
0
 
LVL 24

Expert Comment

by:glcummins
ID: 18783013
You are defining the function 'getPreviousWeekday' within your for() loop, which will cause errors.

Take the entire 'getPreviousWeekday()' function and put it outside your loop:

<?php

$inputDate = "March, 2007";

list($inputMonth, $inputYear) = explode(', ', $inputDate);

$daysInMonth = date('t', strtotime("$inputMonth $inputYear"));

for ($i=1; $i<=$daysInMonth; $i++)
{
      if (6 > date('N', strtotime("$i $inputMonth $inputYear")))
      {
         $weekday = date('mdy', strtotime("$i $inputMonth $inputYear"));

    ////////////  Get previous weekday /////////

            $inputMonth = substr($weekday, 0, 2);
            $inputDay = substr($weekday, 2, 2);
            $inputYear = substr($weekday, 4, 2);

           $timestamp = mktime(0, 0, 0, $inputMonth, $inputDay, $inputYear);

           getPreviousWeekday($timestamp);

                 
       /////// END of get previous weekday //////////


          echo "<tr><td>$weekday $previousweekday</td></tr>";
      }
}

function getPreviousWeekday($timestamp) {
      // This function is called recursively until a weekday is found
      $previousDay = $timestamp - 86400; // Substract one day of seconds (24 hours x 60 minutes x 60 seconds)
      
            if (6 > date('N', $previousDay)) {
      
      $previousWeekday = date('mdy', $previousDay);
      print "$previousWeekday<br />";
      } else {
      getPreviousWeekday($previousDay);
      }
}
?>
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 

Author Comment

by:Randall-B
ID: 18783145
OK, that gets rid of that error, but now I get another error.
    I want to do:
 echo "<tr><td>$weekday $previousWeekday</td></tr>";

So I removed the echo $previousWeekday line from the function, and am trying to echo $previousWeekay in the table cell along with $weekday.  However, only one date is showing, and it is the unix timestamp error.

I want to get this:
   030107    022807
   030207    030107
   030507    030207
. . .  etc.

   But this is the output:

030107  
123169  
123169  
. . .  etc.
0
 
LVL 24

Expert Comment

by:glcummins
ID: 18783174
How about, add the print statement back into the getPreviousWeekday() function, and use this:

echo "<tr><td>$weekday ";
getPreviousWeekday($weekday);
echo "</td></tr>";

If that does not work, can you post your code as it stands now?
0
 

Author Comment

by:Randall-B
ID: 18783264
OK, that made it print two numbers, but not the right ones.  It's like this:

030107   123169
123169   010170
123169   010170
123169   010170
. . . etc.
   So I'm posting the code as it stood in my previous comment.  See:  http://216.92.61.99/weekdayphp.txt

But instead of the timestamp-based function, what about using something like this within the original loop, to simply detect if $weekday is a Monday, and if so, subtract 3 days to make it a Friday (but subtract only 1 day from the other weekdays):

if ((date('w'), $weekday) == '0') {
   $prevousWeekday = date('mdy', strtotime('- 3 day'));
} else {
   $prevousWeekday = date('mdy', strtotime('- 1 day'));
}

I was trying to do that before, but I'm having trouble with the syntax for
   if (date('w'), $weekday) == '0')

Should it be:
  if (date('w'), strtotime($weekday)) == '0')
?  I can't get it to work for some reason.
Thanks.
0
 

Author Comment

by:Randall-B
ID: 18787029
I came up with this to convert any date like "030507" to the previous weekday:

<?php

$input = "030507";

echo "$input ";
echo getPreviousWeekday($input);


function getPreviousWeekday($input) {
   $inputMonth = substr($input, 0, 2);
   $inputDay = substr($input, 2, 2);
   $inputYear = substr($input, 4, 2);
   $timestamp = strtotime("$inputYear-$inputMonth-$inputDay");
       if (date("w", $timestamp) == 1) { // input is Monday
          $previousWeekday = date('mdy', strtotime("-3 day", $timestamp));
        } elseif (date("w", $timestamp) == 0) { // input is Sunday
              $previousWeekday = date('mdy', strtotime("-2 day", $timestamp));      
          } else { // input is not Sunday or Monday
              $previousWeekday = date('mdy', strtotime("-1 day", $timestamp));
        }
    return $previousWeekday;
 }

?>


and the entire working script, which prints all weekdays (and their previousweekday) in a given month, is:


<html>
<body>

<table>

<?php

$inputDate = "March, 2007";

list($inputMonth, $inputYear) = explode(', ', $inputDate);

$daysInMonth = date('t', strtotime("$inputMonth $inputYear"));

for ($i=1; $i<=$daysInMonth; $i++)  {
      if (6 > date('N', strtotime("$i $inputMonth $inputYear"))) {
         $weekday = date('mdy', strtotime("$i $inputMonth $inputYear"));
         $previousweekday = getPreviousWeekday($weekday);
       
      echo "<tr><td>$weekday $previousweekday</td></tr>";
      }
 }

function getPreviousWeekday($input) {
   $inputMonth = substr($input, 0, 2);
   $inputDay = substr($input, 2, 2);
   $inputYear = substr($input, 4, 2);
   $timestamp = strtotime("$inputYear-$inputMonth-$inputDay");
       if (date("w", $timestamp) == 1) { // input is Monday
          $previousWeekday = date('mdy', strtotime("-3 day", $timestamp));
        } elseif (date("w", $timestamp) == 0) { // input is Sunday
              $previousWeekday = date('mdy', strtotime("-2 day", $timestamp));      
          } else { // input is not Sunday or Monday
              $previousWeekday = date('mdy', strtotime("-1 day", $timestamp));
        }
    return $previousWeekday;
 }
?>
</table>
</body>
</html>


That works, although I'm sure it could be improved.
0
 

Author Comment

by:Randall-B
ID: 18787040
And to output the list of weekdays and their previous days in reverse order (from the last weekday of the month down to the 1st weekday of the month), it works with this for . . . loop:

for ($i=$daysInMonth; $i>=1; $i--)

Thanks.
0
 

Author Comment

by:Randall-B
ID: 18787228
I'm accepting your first response as the answer, since it did work as requested in the Question (although the function in my comment above seems to work better in the context of the particular script that I'm using). Thanks!
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Checkout Page Input Field not aligned 1 26
Output in PHP throwing alignment of data off issue 12 43
php help 34 58
Custom Wordpress Loop 22 38
Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
Introduction This article is intended for those who are new to PHP error handling (https://www.experts-exchange.com/articles/11769/And-by-the-way-I-am-New-to-PHP.html).  It addresses one of the most common problems that plague beginning PHP develop…
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question