How do I find the last Xth day using PHP? - php

I'd like to get the timestamp of the last Xth day, how do I do that?
Thanks.

$Xth day of the month?
mktime(0, 0, 0, date('m'), $x, date('Y'));
Most recent $Xth day of the month?
if(date('j') >= $x)
return mktime(0, 0, 0, date('n'), $x, date('Y'));
else
return mktime( 0, 0, 0, date('n') - 1, $x, date('Y'));

if you want $x number of days back, just do:
$timestampxdaysback = time() - (86400 * $x);
// 86400 seconds in a day

If you mean the last day of a month then use:
echo date('d', mktime(0,0,0,$month+1,0,$year));
Where $month is the month you want the last day of. The '0' in the day position is what does the trick. Think of it as the 'yesterday' option.
update
if ($x > date('d') {
$date = mktime(0,0,0,$month-1,$x,date('Y'));
} else {
$date = mktime(0,0,0,$month,$x,date('Y'));
}

would something like this work:
function getXthMonth($x)
{
$current_month = date("m", time());
$current_day = date("d", time());
$current_year = date("Y", time());
if($x <= $current_day)
return $current_month.'/'.$x.'/'.$current_year;
else
{
if($current_month > 1)
{
$current_month--;
return $current_month.'/'.$x.'/'.$current_year;
}
else
{
$current_year--;
return '12/'.$x.'/'.$current_year;
}
}
}

Related

calendar date getting back -1 day, what is wrong, alternate solution?

I'm trying to go back one day in the calendar – What am I doing wrong?
My approach:
$weekdays = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
///////
function getDates($year) {
$dates = array();
date("L", mktime(0, 0, 0, 7, 7, $year)) ? $days = 366 : $days = 365;
///
for($i = 1; $i <= $days; $i++) {
// get Unix timestamp for a date
$month = date('F', mktime(0, 0, 0, 1, $i, $year));
$wk = date('W', mktime(0, 0, 0, 1, $i, $year));
$wkDay = date('D', mktime(0, 0, 0, 1, $i, $year));
$day = date('d', mktime(0, 0, 0, 1, $i, $year));
///
$dates[$month][$wk][$wkDay] = $day;
}
return $dates;
}
//////
$year = 2020; // from this Year
$dates = getDates($year);
$countW = 1; // for counting weeks
// Output code
echo '<h2><span>Calendar '.$year.'</span></h2>';
foreach($dates as $month => $weeks) {
echo '<div>';
echo '<table>';
echo '<caption>'.$year.' '.$month.'</caption>';
echo '<tr>';
echo '<th>W</th>';
echo '<th>'.implode('</th><th>', $weekdays).'</th>';
echo '</tr>';
echo '<tr>';
foreach ($weeks as $week => $days){
echo '<tr><td>'.$countW++.'</td>';
foreach ($weekdays as $day) {
echo '<td>';
/* I'm overwhelmed here! */
echo isset($days[$day]) ? $days[$day] : date('d', strtotime('-1 day')); // outputted is 5
echo '</td>';
}
echo '</tr>';
}
echo '</tr>';
echo '</table>';
}
I tried the following codes:
date('d', strtotime('-1 day')) // outputted: 5 (today is 6)
$jd = gregoriantojd(01,06,2020); echo jddayofweek($jd,2); // outputted: Mon (today is Tue)
With this code I get the day from the current day before.
It is expected the day before the specified day
what is happening
is expected
With this code I get the day from the current day before. It is expected the day before the specified day
The day that is "specified" here date('d', strtotime('-1 day')) is the current day.
Generally speaking, a (American) monthly calendar will leave a blank space if the day is not in the month. For example:
That would be a super simple fix to the problem. If not, you'll need to adjust your thinking (and the code!). In the case of the first week of January, the dates for Mon and Tues are -2 and -1 from the first day of January. Similarly, in the last week they are -2 and -1 from the first day of February (or +1, +2 from the last day of January).

Finding date range for week for particular month and year

Suppose I have a date available with me: 2016-07
I want to find date range of Week like this:
2016-07-03 to 2016-07-09
2016-07-10 to 2016-07-16
2016-07-17 to 2016-07-23
2016-07-24 to 2016-07-30
How can i achieve this?
I have tried using MySql but failed. Now I'm trying to do php.
This piece of code should do exactly what you want, if not please tell me or if you have questions
$date = "2016-07"; //Your date, can be any given date of this format
$monthAndYear = explode("-", $date);
$weeks = array();
$start = mktime(0, 0, 0, $monthAndYear[1], 1, $monthAndYear[0]);
$start -= 86400; //There are surely better ways
//find beginning if first week
do
{
$start += 86400;// Add one day
$tmp = date("N", $start);
}
while($tmp != 1);
//Get all weeks. If you want only those which are in the current month use this instead:
//while(date("n", ($start + 6 * 86400)) == $monthAndYear[1])
while(date("n", $start) == $monthAndYear[1])
{
$date = date("Y-m-d", $start);
$start += (6 * 86400);
$date .= " to ".date("Y-m-d", $start);
$weeks[] = $date;
$start += 86400;
}
echo "<pre>";
var_dump($weeks);
echo "</pre>";
The output is this:
array(4) {
[0]=>
string(24) "2016-07-04 to 2016-07-10"
[1]=>
string(24) "2016-07-11 to 2016-07-17"
[2]=>
string(24) "2016-07-18 to 2016-07-24"
[3]=>
string(24) "2016-07-25 to 2016-07-31"
}
With the second while option the result will be the same because the 31th is the end of the month and also the end of a week.
Please try the following code it produces the same output as yours:
function weeksRangesOfMonth($month, $year) {
$start_time = mktime(0, 0, 0, $month, 1, $year);
$start_time = mktime(0, 0, 0, $month, date('d', strtotime('First Monday', $start_time)), $year);
$end_time = mktime(0, 0, 0, $month, date('t', $start_time), $year);
$start = date("Y-m-d", $start_time);
$end = date("Y-m-d", $end_time);
for($date = $start; $date <= $end; $date = date('Y-m-d', strtotime($date. ' + 7 days'))) {
$time= strtotime($date);
$from = date("Y-m-d", strtotime('Last Sunday', $time));
$to = date("Y-m-d", strtotime('Next Saturday', $time));
echo "Start: ".$from.", End: ".$to;
echo "<br>";
}
}
weeksRangesOfMonth(7, 16);
Demo: http://codepad.org/mWSxphvA

Second Saturday of Month Function in PHP

I found this PHP code credit to creator and want to implement it a different way:
The goal is to have the code automatically adjust the following statement to be the second Saturday of every month from now until eternity:
Next membership meeting: Saturday, MONTH, DAY, YEAR, 11 a.m. to noon.
As in: "Saturday, February 12, 2011, 11 a.m. to noon."
I am no PHP guru, can someone kindly edit it to work?
<?php
function nextMeeting($nextMonth = false) {
$day=date("j");
$month=date("n");
$year=date("Y");
if ($nextMonth) {
$day=1;
if ($month == 12) {
$month=1;
$year++;
} else {
$month++;
}
}
$dayofweek=date("w");
$firstOfMonth=date("w",mktime(0, 0, 0, $month , 1, $year ));
// figure out what date is the second Saturday of the month
if ( $firstOfMonth > 0 ) {
$firstSunday= 8 - $firstOfMonth;
} else {
$firstSunday= 1;
}
$firstSundayDate=date("D",mktime(0, 0, 0, $month ,
$firstSunday, $year));
// figure out what date the third monday of the month is
if ( $firstOfMonth > 1) {
$offSet = 8 - $firstOfMonth;
} elseif ( $firstOfMonth == 0 ) {
$offSet=1;
} else {
$offSet=0;
}
$thirdMonday= 15 + $offSet;
$thirdMondayDate=date("D",mktime(0, 0, 0, $month ,
$thirdMonday, $year));
// lets see which of these dates now applies
if ($day <= $firstSunday) {
// we didn't miss the first meeting
$nextMeeting=$firstSunday;
$nextMeetingDate=mktime(0, 0, 0, $month ,
$nextMeeting, $year);
} elseif ( ($day > $firstSunday) && ($day <= $thirdMonday) ) {
// we missed the first meeting of the month, but can still make the second
$nextMeeting=$thirdMonday;
$nextMeetingDate=mktime(0, 0, 0, $month ,
$nextMeeting, $year);
} else {
// we need to wait until next month
$nextMeetingDate=nextMeeting(1);
$nextMeeting=nextMeeting(1);
}
return $nextMeetingDate;
}
$meeting=nextMeeting();
echo "Next membership meeting is on " . date('l dS \of F Y', $meeting);
?>
How about you save about 5000 lines and try this
<?
echo date('Y-m-d', strtotime('second saturday of february 2011'));
Edit
Ok, I lied in the comments, I will write it for you.
<?
$now=date("U");
$monthyear=date("F Y");
$secondsat=date('U', strtotime($monthyear.' second saturday'));
if ($now>$secondsat) {
$monthyear=date("F Y", "next month");
$secondsat=date('U', strtotime($monthyear.' second saturday'));
}
echo date("m/d/Y",$secondsat);
You could change the function a little like this:
function nextMeeting($date = null)
{
$day = date("j", $date);
$month = date("n", $date);
$year = date("Y", $date);
// remove the nextMonth bit
$dayofweek=date("w", $date);
$firstOfMonth=date("w",mktime(0, 0, 0, $month , 1, $year ));
// all the same between here and the end
return $nextMeetingDate;
}
for ($i = 0; $i < 12; $i++) {
$date = mktime(0, 0, 0, date('m') + $i, date('d'), date('y'));
echo "Next membership meeting is on " . date('l dS \of F Y', nextMeeting($date));
}
That should get you the next 12 meetings after today...
I needed to find the DTS date range, so here's how I did it:
$year = date("Y");
$dtsStart = date('Y-m-d 02:00:00', strtotime("Second Sunday Of March {$year}"));
$dtsEnd = date('Y-m-d 02:00:00', strtotime("First Sunday Of November {$year}"));
And of course you can replace the month with some simple coding as well.

Timestamps of start and end of month

How can one get the timestamps of the first and last minutes of any month using PHP?
You can use mktime and date:
$first_minute = mktime(0, 0, 0, date("n"), 1);
$last_minute = mktime(23, 59, 59, date("n"), date("t"));
That is for the current month. If you want to have it for any month, you have change the month and day parameter accordingly.
If you want to generate it for every month, you can just loop:
$times = array();
for($month = 1; $month <= 12; $month++) {
$first_minute = mktime(0, 0, 0, $month, 1);
$last_minute = mktime(23, 59, 59, $month, date('t', $first_minute));
$times[$month] = array($first_minute, $last_minute);
}
DEMO
With PHP 5.3, you can do
$oFirst = new DateTime('first day of this month');
$oLast = new DateTime('last day of this month');
$oLast->setTime(23, 59, 59);
In PHP 5.2
Note: as AllThecode pointed out in the comments below, this next example only works if you do the $oFirst portion first. If you add +1 month to new DateTime the result will jump an extra month ahead on the last day of the month (as of php 5.5.9).
$oToday = new DateTime();
$iTime = mktime(0, 0, 0, $oToday->format('m'), 1, $oToday->format('Y'));
$oFirst = new DateTime(date('r', $iTime));
$oLast = clone $oFirst;
$oLast->modify('+1 month');
$oLast->modify('-1 day');
$oLast->setTime(23, 59, 59);
Use mktime for generating timestamps from hour/month/day/... values and cal_days_in_month to get the number of days in a month:
$month = 1; $year = 2011;
$firstMinute = mktime(0, 0, 0, $month, 1, $year);
$days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$lastMinute = mktime(23, 59, 0, $month, $days, $year);
I think better then
$first_minute = mktime(0, 0, 0, date("n"), 1);
$last_minute = mktime(23, 59, 0, date("n"), date("t"));
is:
$first_minute = mktime(0, 0, 0, date("n"), 1);
$last_minute = mktime(23, 59, 0, date("n") + 1, 0);
This requires PHP > 5.2 and need adjustement for the "minutes" part
$year = ...; // this is your year
$month = ...; // this is your month
$month = ($month < 10 ? '0' . $month : $month);
$start = new DateTime($year . '-' . $month . '-01 00:00:00');
$end = $start->modify('+1 month -1 day -1 minute'); //perhaps this need 3 "->modify"
echo $start->format('U');
echo $end->format('U');
(not tested)
Ref: http://www.php.net/manual/en/class.datetime.php
$date = new \DateTime('now');//Current time
$date->modify("-1 month");//get last month
$startDate = $date->format('Y-m-01');
$endDate = $date->format('Y-m-t');
Best Way do like this..
$first_day = date('m-01-Y h:i:s',strtotime("-1 months"));
$last_day = date('m-t-Y h:i:s',strtotime("-1 months"));

In PHP, is there an easy way to get the first and last date of a month?

I need to get the first and last day of a month in the format YYYY-MM-DD given only the month and year. Is there a good, easy way to do this?
$first = date('Y-m-d', mktime(0, 0, 0, $month, 1, $year));
$last = date('Y-m-t', mktime(0, 0, 0, $month, 1, $year));
See date() in PHP documentation.
First day is always YYYY-MM-01, isn't it? Example: date("Y-M-d", mktime(0, 0, 0, 8, 1, 2008))
Last day is the previous day of the next month's first day:
$date = new DateTime("2008-09-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");
The first day of the month is always 1.
So it will become
YYYY-MM-01
the last day can be calculated as:
<?php
$num = cal_days_in_month(CAL_GREGORIAN, 8, 2003); // 31
echo "There was $num days in August 2003";
?>
OK, first is dead easy.
date ('Y-m-d', mktime(0,0,0,MM,01,YYYY));
Last is a little trickier, but not much.
date ('Y-m-d', mktime(0,0,0,MM + 1,-1,YYYY));
If I remember my PHP date stuff correctly...
**edit - Gah! Beaten to it about a million times...
Edit by Pat:
Last day should have been
date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1
<?php
echo "Month Start - " . $monthStart = date("Y-m-1") . "<br/>";
$num = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y"));
echo "Monthe End - " . $monthEnd = date("Y-m-".$num);
?>
The easiest way to do this with PHP is
$dateBegin = strtotime("first day of last month");
$dateEnd = strtotime("last day of last month");
echo date("MYDATEFORMAT", $dateBegin);
echo "<br>";
echo date("MYDATEFORMAT", $dateEnd);
Or the last week
if (date('N', time()) == 7) {
$dateBegin = strtotime("-2 weeks Monday");
$dateEnd = strtotime("last Sunday");
} else {
$dateBegin = strtotime("Monday last week");
$dateEnd = strtotime("Sunday last week");
}
Or the last year
$dateBegin = strtotime("1/1 last year");
$dateEnd = strtotime("12/31 this year");
By the way #ZombieSheep solution
date ('Y-m-d', mktime(0,0,0,$MM + 1,-1,$YYYY));
does not work it should be
date ('Y-m-d', mktime(0,0,0,$MM + 1,0,$YYYY)); // Day zero instead of -1
Of course #Michał Słaby's accepted solution is the simplest.
Just to verify that I didn't miss any loose ends:
$startDay = 1;
if (date("m") == 1) {
$startMonth = 12;
$startYear = date("Y") - 1;
$endMonth = 12;
$endYear = date("Y") - 1;
}
else {
$startMonth = date("m") - 1;
$startYear = date("Y");
$endMonth = date("m") - 1;
$endYear = date("Y");
}
$endDay = date("d") - 1;
$startDate = date('Y-m-d', mktime(0, 0, 0, $startMonth , $startDay, $startYear));
$endDate = date('Y-m-d', mktime(0, 0, 0, $endMonth, $endDay, $endYear));
try this to get the number of days in the month:
$numdays = date('t', mktime(0, 0, 0, $m, 1, $Y));
Example; I want to get first day and last day of current month.
$month = (int) date('F');
$year = (int) date('Y');
date('Y-m-d', mktime(0, 0, 0, $month + 1, 1, $year)); //first
date('Y-m-d', mktime(0, 0, 0, $month + 2, 0, $year)); //last
When you run this for instance at date 2015-01-09, the first and last values will be sequentially;
2015-01-01
2015-01-31
Tested.
From here(get next month last day) that is marked as duplicated, so i can't add comment there, but people can got bad answers from there.
Correct one for last day of next month:
echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-t'));
Correct one for first day of next month:
echo ((new DateTime(date('Y-m').'-01'))->modify('+1 month')->format('Y-m-01'));
Code like this will be providing March from January, so that's not what could be expected.
echo ((new DateTime())->modify('+1 month')->format('Y-m-t'));
proper way to build a relative date from now is:
//bad example - will be broken when generated at 30 of December (broken February)
echo date("Y-m-d", strtotime("now"))."\n";
echo date("Y-m-d", strtotime("now + 1 month"))."\n";
echo date("Y-m-d", strtotime("now + 2 month"))."\n";
echo date("Y-m-d", strtotime("now + 3 month"))."\n";
//good example, you can change first day to last day or any day
echo date("Y-m-d", strtotime("first day of this month"))."\n";
echo date("Y-m-d", strtotime("first day of next month"))."\n";
echo date("Y-m-d", strtotime("first day of +2 month"))."\n";
echo date("Y-m-d", strtotime("first day of +3 month"))."\n";
and the result will be:
2021-12-30
2022-01-30
2022-03-02
2022-03-30
2021-12-01
2022-01-01
2022-02-01
2022-03-01

Categories