MM-dd-yyyy
Kann mir jemand bei einem gegebenen Datumsformat helfen, den ersten Tag der Woche zu bekommen?
DateTime
Lösung und die meisten Antworten liefern sie nicht. =)
MM-dd-yyyy
Kann mir jemand bei einem gegebenen Datumsformat helfen, den ersten Tag der Woche zu bekommen?
DateTime
Lösung und die meisten Antworten liefern sie nicht. =)
Antworten:
Hier ist was ich benutze ...
$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));
$ day enthält eine Zahl von 0 bis 6, die den Wochentag darstellt (Sonntag = 0, Montag = 1 usw.).
$ week_start enthält das Datum für den Sonntag der aktuellen Woche als MM-TT-JJJJ.
$ week_end enthält das Datum für den Samstag der aktuellen Woche als MM-TT-JJJJ.
strtotime('this week', time());
Zeit ersetzen (). Die Methoden für den nächsten Sonntag / letzten Montag funktionieren nicht, wenn der aktuelle Tag Sonntag / Montag ist.
$monday = strtotime('last monday', strtotime('tomorrow'));
this week
funktioniert nicht, wenn Sie immer den vorherigen Wochenbeginn haben müssen, aber @ LewisBuckleys Kommentar macht es.
time()
ist optional, wenn Sie heute angeben möchten.
Sehr einfach zu bedienende strtotime
Funktion :
echo date("Y-m-d", strtotime('monday this week')), "\n";
echo date("Y-m-d", strtotime('sunday this week')), "\n";
Es unterscheidet sich ein wenig zwischen den PHP-Versionen :
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-30
2015-03-29
Relative Beschreibungen wie diese Woche haben ihren eigenen Kontext. Das Folgende zeigt die Ausgabe für diese Woche Montag und Sonntag, wenn es ein Montag oder ein Sonntag ist:
$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";
$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";
Againt es unterscheidet sich ein bisschen zwischen PHP-Versionen :
2015-03-16
2015-03-22
2015-03-23
2015-03-29
2015-03-16
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-22
2015-03-23
2015-03-29
2015-03-23
2015-03-29
2015-03-30
2015-03-29
Halte es einfach :
<?php
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');
?>
Quelle: PHP-Handbuch
NB: Wie einige Benutzer kommentierten, wird der Wert von $ dateTime geändert.
$dateTime = new \DateTime('2012-05-14');
DateTime
bedeutet, dass der Code auch dann funktioniert, wenn DateTime
im aktuellen Namespace eine andere Klasse aufgerufen wird .
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));
Dies gibt Ihnen den Wochentag des angegebenen Datums an, an dem 0
= Sonntag und 6
= Samstag. Von dort aus können Sie einfach rückwärts zum gewünschten Tag rechnen.
Diese Frage braucht eine gute DateTime- Antwort: -
function firstDayOfWeek($date)
{
$day = DateTime::createFromFormat('m-d-Y', $date);
$day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
return $day->format('m-d-Y');
}
var_dump(firstDayOfWeek('06-13-2013'));
Ausgabe:-
string '06-10-2013' (length=10)
Dies wird sich mit Jahresgrenzen und Schaltjahren befassen.
BEARBEITEN: Der folgende Link läuft nicht mehr auf der angegebenen PHP-Version. Es läuft auf PHP 5.6, was die Zuverlässigkeit von strtotime verbessert, aber nicht perfekt ist! Die Ergebnisse in der Tabelle sind Live-Ergebnisse aus PHP 5.6.
Für das, was es wert ist, hier eine Aufschlüsselung des wackeligen Verhaltens von strtotime bei der Bestimmung eines konsistenten Referenzrahmens:
http://gamereplays.org/reference/strtotime.php
Grundsätzlich erhalten Sie nur mit diesen Zeichenfolgen zuverlässig das gleiche Datum, unabhängig davon, an welchem Wochentag Sie sich gerade befinden, wenn Sie sie aufrufen:
strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday");
Der folgende Code sollte mit jedem benutzerdefinierten Datum funktionieren, verwendet nur das gewünschte Datumsformat.
$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) );
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;
Ich habe den Code mit PHP 5.2.17 getestet. Ergebnisse:
Start: 30-07-2012
End: 05-08-2012
Unter der Annahme, dass Montag der erste Tag der Woche ist, funktioniert dies:
echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
Dies ist, was ich benutze, um den ersten und letzten Tag der Woche von jedem Datum zu erhalten . In diesem Fall ist Montag der erste Tag der Woche ...
$date = date('Y-m-d') // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');
Hier betrachte ich Sonntag als ersten und Samstag als letzten Tag der Woche.
$m = strtotime('06-08-2012');
$today = date('l', $m);
$custom_date = strtotime( date('d-m-Y', $m) );
if ($today == 'Sunday') {
$week_start = date("d-m-Y", $m);
} else {
$week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));
}
if ($today == 'Saturday') {
$week_end = date("d-m-Y", $m);
} else {
$week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));
}
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;
Ausgabe :
Beginn: 05.08.2012
Ende: 08.11.2012
Wie wäre es damit?
$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));
Versuche dies:
function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
$wk_ts = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
$mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
return date($format, $mon_ts);
}
$sStartDate = week_start_date($week_number, $year);
$sEndDate = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));
(aus diesem Forenthread )
Dies ist die kürzeste und am besten lesbare Lösung, die ich gefunden habe:
<?php
$weekstart = strtotime('monday this week');
$weekstop = strtotime('sunday this week 23:59:59');
//echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
?>
strtotime
ist schneller als new DateTime()->getTimestamp()
.
Benutz einfach date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
Mit der folgenden PHP-Version vor 5.3 erhalten Sie mit der folgenden Funktion einen ersten Tag der Woche mit dem angegebenen Datum (in diesem Fall - Sonntag, 03.02.2013):
<?php
function startOfWeek($aDate){
$d=strtotime($aDate);
return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
}
echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>
$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');
if($today_day != "Mon")
$start_of_week = date('Ymd', strtotime("last monday"));
if($today_day != "Sun")
$end_of_week = date('Ymd', strtotime("next sunday"));
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));
Sie müssen zuerst am nächsten Montag und dann am letzten Montag den nächsten Montag bekommen. Wenn also das angegebene Datum Montag ist, wird das gleiche Datum nicht letzte Woche Montag zurückgegeben.
Wenn Sie den Montag als Beginn Ihrer Woche wünschen, gehen Sie folgendermaßen vor:
$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));
Eine clevere Möglichkeit, dies zu tun, besteht darin, PHP Zeitzonenunterschiede und Sommerzeit (DST) verarbeiten zu lassen. Lassen Sie mich Ihnen zeigen, wie das geht.
Diese Funktion generiert alle Tage von Montag bis einschließlich Freitag (praktisch zum Generieren von Wochentagen):
class DateTimeUtilities {
public static function getPeriodFromMondayUntilFriday($offset = 'now') {
$now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
$today = $now->setTime(0, 0, 1);
$daysFromMonday = $today->format('N') - 1;
$monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
$saturday = $monday->add(new \DateInterval('P5D'));
return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
}
}
foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
print $day->format('c');
print PHP_EOL;
}
Dies gibt die Daten von Montag bis Freitag für die aktuelle Woche zurück. Um dasselbe für ein beliebiges Datum zu tun, übergeben Sie ein Datum als Parameter an DateTimeUtilities ::getPeriodFromMondayUntilFriday
:
foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
print $day->format('c');
print PHP_EOL;
}
//prints
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00
Nur am Montag interessiert, wie das OP gefragt hat?
$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00
Sie analysieren das Datum mit strptime()
und verwenden es date()
für das Ergebnis:
date('N', strptime('%m-%d-%g', $dateString));
<?php
/* PHP 5.3.0 */
date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date
//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));
//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);
?>
(Hinweis: MM, TT und JJJJ in der Frage sind keine Standardsyntax für das PHP-Datumsformat. Ich kann nicht sicher sein, was gemeint ist, daher setze ich das $ start_date mit ISO Jahr-Monat-Tag.)
Ein anderer Weg, es zu tun ....
$year = '2014';
$month = '02';
$day = '26';
$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());
// 0=Sunday 6=Saturday
if($day!=0){
$newdate = $date->getTimestamp() - $day * 86400; //86400 seconds in a day
// Look for DST change
if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
if($old == 0){
$newdate -= 3600; //3600 seconds in an hour
} else {
$newdate += 3600;
}
}
$date->setTimestamp($newdate);
}
echo $date->format('D Y-m-d H:i:s');
Der einfachste Weg, um den ersten Tag (Montag) der aktuellen Woche zu erhalten, ist:
strtotime("next Monday") - 604800;
Dabei ist 604800 - die Anzahl der Sekunden in 1 Woche (60 * 60 * 24 * 7).
Dieser Code wird nächsten Montag abgerufen und für 1 Woche verringert. Dieser Code funktioniert an jedem Wochentag. Auch wenn heute Montag ist.
Ich fand das ziemlich frustrierend, da meine Zeitzone australisch ist und das strtotime()
britische Daten hasst.
Wenn der aktuelle Tag ein Sonntag ist, strtotime("monday this week")
wird der Tag danach zurückgegeben.
Um dies zu überwinden:
Achtung : Dies gilt nur für australische / britische Daten
$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));
Hier ist ein Einzeiler für den ersten Tag der letzten Woche und den letzten Tag der letzten Woche als DateTime
Objekt.
$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
->setTime(23, 59, 59);
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));
Ich bin ein paar Mal auf diese Frage gestoßen und immer überrascht, dass die Datumsfunktionen dies nicht einfacher oder klarer machen. Hier ist meine Lösung für PHP5, die die DateTime
Klasse verwendet:
/**
* @param DateTime $date A given date
* @param int $firstDay 0-6, Sun-Sat respectively
* @return DateTime
*/
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
$offset = 7 - $firstDay;
$ret = clone $date;
$ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
return $ret;
}
Klonen erforderlich, um eine Änderung des ursprünglichen Datums zu vermeiden.
Wie wäre es mit:
$date = "2013-03-18";
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';
Es ist nicht der beste Weg, aber ich habe getestet und wenn ich in dieser Woche bin, bekomme ich den richtigen Montag, und wenn ich an einem Montag bin, werde ich diesen Montag bekommen.