php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.08.2007, 05:21  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard Excel-Formel übersetzen: wie vielter Wochentag ist ein Datum

Hallo. Versuche eine Excel-Formel auf PHP zu übersetzten, die folgendes (unter Excel erfolgreich) bewerkstelligt:
Sage mir, ob das Suchdatum, im Beispiel ein Sonnabend, der erste, zweite oder dritte Sonnabend im Monat ist.
Die Excel-Formel dazu ist eigentlich ganz leicht:
Code:
=GANZZAHL((A1-MONATSENDE(A1;-1)+6)/7
(wobei in der Zelle A1 ein Datum wie 12.05.2007 steht)

Heraus kommt eine Zahl 1-5, die das gewünschte Resultat bringt.

Mein Versuch in PHP bislang:
um an den Monatsletzen zu kommen:
1. Suche den 1. des Suchmonats (1.5.2007)
2. Suche den 1. der Vormonats (1.4.2007)
3. Berechne die Tage dazwischen (30)
4. zähle diese Tage auf den 1. des Vormonats drauf (1.4.2007 + 30 ) und ich habe den Monatsletzten, mit dem ich dann weiterarbeiten kann.

Mein 1. Problem nun ist, dass bei dem unten aufgeführten Code immer eine 30 herauskommt, auch wenn ich andere Monate als Startdatum setze.
Was ist an der Herangehensweise falsch?

Das 2. Problem besteht in der Weiterverarbeitung des Ergebnisses, um auf die Excel-Formel zu kommen.
Hätte ich also das Datum des Letzten im Vormonat (vor dem Suchmonat), dann würde ich im nächsten Schritt doch von dem Suchdatum das Monatsende des Vormonats abziehen.
Bei Excel kommt in diesem Fall beispielsweise 12 raus.
Bei mir hingegen, wenn ich meine beiden mit mktime formatierten Datumswerte ausgeben will, kommt eine Zahl heraus , die ja noch für die Ausgabe bzw. Weiterverarbeitung formatiert werden müsste. In dem Beispiel werhalte ich die Zahl 691200.
Mit date('d', $differenz) komme ich auch nicht auf die 12 wie bei Excel, sondern auf 01, wahrscheinlich weil der 1.1.1970 ausgegeben wird und meine mktime-Zahl nicht übersetzt wird.

Wie müsste daher der Befehl aussehen, um aus der Differenz zweier mktime-Zeiten eine Zahl in Tagen bzw. anderen Einheiten zu bekommen, mit denen man im Sinne der Excel-Formel weiterarbeiten könnte?

Wäre die Differenz zwischen Suchdatum und Monatletztem also klar, müsste der Rest der Formel ja wohl klappen mit:
($diff +6)/7 und dann noch mit ceil oder floor runden.

Hier mein Code:
Code:
$suchdatum = '12.05.2007';
$suchdatum_erster = mktime(0,0,0,substr($suchdatum,3,2),1,substr($suchdatum,-4));//macht 1.5.2007
$suchdatum_vormonat_erster = mktime(0,0,0,substr($suchdatum,3,2)-1,1,substr($suchdatum,-4));//macht 1.4.2007

$suchdatum_ersterd = date('d.m.Y', $suchdatum_erster);//macht 1.5.2007 formatiert
$suchdatum_vormonat_ersterd = date('d.m.Y', $suchdatum_vormonat_erster);//macht 1.4.2007 formatiert

//Für die weitere Verarbeitung werden die Zeitangaben aus den beiden gefundenen Datumswerten extrahiert
$x_jahr = substr($suchdatum_ersterd,-4) ;
		 $x_monat = substr($suchdatum_ersterd,3,2) ;
		 $x_tag = substr($suchdatum_ersterd,0,2) ;

$y_jahr = substr($suchdatum_vormonat_ersterd,-4) ;
		 $y_monat = substr($suchdatum_vormonat_ersterd,3,2) ;
		 $y_tag = substr($suchdatum_vormonat_ersterd,0,2) ;

//Jetzt die Differenz
$diff = mktime ( 0, 0, 0, $x_monat, $x_tag, $x_jahr) - mktime ( 0, 0, 0, $y_monat, $y_tag, $y_jahr);

echo abs($diff/(60*60*24));
 //Kommt immer 30 raus
 //echo ceil(($diff +6)/7);
webazubi ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.08.2007, 08:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Machs net so kompliziert..

PHP-Code:
<?php
function calcWeekday($date null)
{
  if (
is_null($date)) {
    
$date date('Y-m-d');
  }
  list (
$y$m$d) = explode('-'$date);
  return array(
'weekday' => date('l'$date), 'count' => ceil($d 7));
}
list (
$weekday$count) = calcWeekday();
echo 
"$weekday, $count";
?>
Schau dir dazu auch nochmal date() an:
http://de.php.net/date
Zitat:
Um Datumsangaben in anderen Sprach-/Zeitzonen-Formaten auszugeben, sollten Sie die Funktionen setlocale() und strftime() benutzen.
Zergling-new ist offline  
Alt 02.08.2007, 17:09  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Hey, das klappt ja, (nicht das ich daran gezweifelt hätte), besten Dank.
Zitat:
Zitat von Zergling
Machs net so kompliziert.
Dann frage ich mal weiter:
Mein nächster Schritt wäre jetzt zu erreichen, in einem bestimmten Monat den, sagen wir, 2. Samstag anzuzeigen.

Dazu würde ich:
1. Den Anfang des gesuchten Monats errechnen
2. Den Wochentag bestimmen (1-7 bz. 0-6)
3. Das Ergebnis der Funktion *7 mit diesem Wochentagswert am Monatsersten addieren, vorausgesetzt es handelt sich um den gleichen Wochentag. Ansonsten für jeden möglichen Tag der Woche eine eigene Berechnung anfertigen.
Oder geht es auch einfacher?
webazubi ist offline  
Alt 02.08.2007, 17:38  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
ich würde das prozedural dann so implementieren:
PHP-Code:
<?php
function getDateByWeekday($year$month$weekday$count)
{
    
// letzten Tag des Vormonats errechnen
    // ab dann den nächsten übergebenen Wochentag suchen (lassen mit strtotime())
    // da er ab dem Folgetag gesucht wird, benötigen wir den letzten des Vormonats
    
$firstWeekday date('j'strtotime("next $weekday"mktime(000$month0$year)));
    
// jetzt haben wir den ersten abgefragten Wochentag des Monats
    // jetzt einfach mit dem $count aufsummieren (wird 3 übergeben, wird 14 addiert usw. (und nicht 21), da wir den ersten Wochentag ja bereits haben, sonst würden wir hier ja auch 7 addieren und kämen ungewollt zum 2. Wochentag des Monat
    
$requestedDay   $firstWeekday + ($count 1) * 7;
    return 
date('Y-m-d'mktime(000$month$year$requestedDay));
    
// jetzt können wir sogar den 10. oder beliebigsten Faktor eines Wochentages angeben
}

// Start Bundesliga-Saison 2007/2008 am 2. Freitag des August 2007
echo getDateByWeekday(20078'Friday'2);
// = 2007-08-10
?>
Wobei ich statt "Friday" eher den Weekday-Index aus date("l") verwenden würde, kannst du ja grad selbst machen, falls du das möchtest.

strtotime() ist wirklich sehr mächtig, wobei ich bei Schleifendurchläufen dann versuchen würde darauf zu verzichten. Aber einmalig ist das in Ordnung.
Zergling-new ist offline  
Alt 02.08.2007, 18:24  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Hm, bei der Funktion kommt bei mir was anderes als 2007-08-10
raus.
echo getDateByWeekday('2007', '8', 'Friday', 2); = 2016-01-28
webazubi ist offline  
Alt 02.08.2007, 18:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hoppla, hab 2 Parameter von mktime() vertauscht .. findest doch bestimmt selbst wo und welche
Zergling-new ist offline  
Alt 02.08.2007, 19:57  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Zitat:
Zitat von Zergling
Hoppla, hab 2 Parameter von mktime() vertauscht .. findest doch bestimmt selbst wo und welche
Okay, das Jahr nach hinten und die Tage davor, Scheiß Syntax immer, dachte schon es sei strtotime.
Aber damit kann ich jetzt erst mal arbeiten, danke.
webazubi ist offline  
Alt 02.08.2007, 20:38  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Warum klappt das hier nicht?
Code:
$test = "2007, 8, 'Friday', 2";
echo getDateByWeekday($test);
Versuche schon die ganze Zeit Friday zu maskieren, aber ich bekomme kein Ergebnis aus der Funktion sobald ich die Werte in eine Variable schreibe.

Nachtrag: Okay, das hier klappt zumindest
Code:
$test1 = "2007";
$test2 = "8";
$test3 = "Friday";
$test4 = "3";

echo getDateByWeekday($test1, $test2, $test3, $test4);
webazubi ist offline  
Alt 02.08.2007, 21:52  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Zitat:
Zitat von Zergling
ich würde das prozedural dann so implementieren:
Hier schmeißt er mir ein falsches Datum aus: Gebe mir den 1. Dienstag im August 2007 (7. August)

Code:
$test1 = "2007";
$test2 = "8";
$test3 = "Tuesday";
$test4 = "1";
echo getDateByWeekday($test1, $test2, $test3, $test4);
= 2007-08-31
webazubi ist offline  
Alt 02.08.2007, 22:27  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.256
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Zitat von webazubi
Warum klappt das hier nicht?
Code:
$test = "2007, 8, 'Friday', 2";
echo getDateByWeekday($test);
Zumindest das solltest Du Dir durch Blick in ein PHP Basic Tutorial selbst beantworten können.
nikosch ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wochentag für beliebiges Datum auslesen? PHP Tipps 2004 3 05.08.2004 23:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
excel substring deutsch, substring excel deutsch, excel formel substring deutsch, wievielter wochentag im monat, excel substr, substr excel deutsch, excel wievielter wochentag im monat, excel wochentag nach datum, excel formel in php, php excel formeln, substring übersetzen, wievielter wurde deutschland 2006, excelformel wochentag, excel 2000 wenn funktion datum mit monatsende, excel 2007 übersetzen, calcweekday java befehl, php wievielter tag aus datum, wie finde ich den wochentag bei excel 2007 raus, excel nächster wochentag, wochentag unter excel

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.