Avatar billede donslund Nybegynder
10. februar 2004 - 09:33 Der er 22 kommentarer og
1 løsning

Vrøvl med datoer

Dette stykke kode:

$Months = array("", "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");
$Days = array("Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag");

$CreateDate = $row[foedselsdato];

list ($CreateYear, $CreateMonth, $CreateDay) = explode ("-", $CreateDate);
$Dato = mktime(0, 0, 0, $CreateMonth, $CreateDay, $CreateYear);
$MonthName = $Months[intval($CreateMonth)];
$DayName = $Days[date("w", $Dato)];
$MonthDay = date("j", $Dato);

$datostr = "$DayName d. $MonthDay. $MonthName $CreateYear";

giver hvis man fodrer det med 1977-07-28 rigtigt nok Torsdag d. 28. Juli 1977, men fodrer man det med 1949-04-27, så skriver den Torsdag d. 1. April 1949.
Er der nogen, der kan regne det ud?

Den laver samme problem med andre datoer også.
Avatar billede donslund Nybegynder
10. februar 2004 - 10:15 #1
Denne linie $Dato = mktime(0, 0, 0, $CreateMonth, $CreateDay, $CreateYear);
returnerer -1 med datoen i 1949.
Avatar billede donslund Nybegynder
10. februar 2004 - 10:17 #2
Kan problemet være, at vi har at gøre med en dato før 1. januar 1970?
Avatar billede detox Nybegynder
10. februar 2004 - 11:24 #3
Ja, det har du nok ret i. mktime() returnerer jo kun timestamps fra 1/1 1970.
Avatar billede detox Nybegynder
10. februar 2004 - 11:34 #4
I øvrigt kan din kode minimeres til:

$CreateDate = $row['foedselsdato'];
setlocale(LC_ALL, "danish");
$datostr = strftime("%A d. %d. %B %Y", strtotime($CreateDate));
Avatar billede donslund Nybegynder
10. februar 2004 - 11:40 #5
Kan den lille kode så benyttes til datoer før 1970?
Avatar billede detox Nybegynder
10. februar 2004 - 11:49 #6
Nej, du løber ind i de samme begrænsninger vedr. timestamps, hvilket er bestemt af dit styresystem.
Avatar billede donslund Nybegynder
10. februar 2004 - 12:00 #7
Okay. Jeg finder en anden måde at vise fødselsdatoer på så.
Avatar billede detox Nybegynder
10. februar 2004 - 12:12 #8
Du kan måske bruge nogle cal funktioner. Fx:

$Months = array("Jan"=>"Januar", "Feb"=>"Februar", "Mar"=>"Marts", "Apr"=>"April", "May"=>"Maj", "Jun"=>"Juni", "Jul"=>"Juli", "Aug"=>"August", "Sep"=>"September", "Oct"=>"Oktober", "Nov"=>"November", "Dec"=>"December");
$Days = array("Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag");

$CreateDate = "1949-04-27";

list ($CreateYear, $CreateMonth, $CreateDay) = explode ("-", $CreateDate);
$jd = GregorianToJD($CreateMonth, $CreateDay, $CreateYear);
$MonthName = $Months[JDMonthName($jd,0)];
$DayName = $Days[JDDayOfWeek($jd,0)];

$datostr = "$DayName d. $CreateDay. $MonthName $CreateYear";
Avatar billede detox Nybegynder
10. februar 2004 - 12:13 #9
Det giver så: "Onsdag d. 27. April 1949", om det så er korrekt ved jeg ikke?
Avatar billede donslund Nybegynder
10. februar 2004 - 15:02 #10
Smid et svar, så får du lidt points.
Avatar billede detox Nybegynder
10. februar 2004 - 15:22 #11
Kan du bruge det?
Avatar billede donslund Nybegynder
10. februar 2004 - 16:35 #12
Nej, den broker sig over det der GregoriantoJD
Avatar billede donslund Nybegynder
10. februar 2004 - 16:47 #13
Jeg fandt dette:

function GregorianToJD ($month,$day,$year) {
  if ($month > 2) {
      $month = $month - 3;
  } else {
      $month = $month + 9;
      $year = $year - 1;
  }
  $c = floor($year / 100);
  $ya = $year - (100 * $c);
  $j = floor((146097 * $c) / 4);
  $j += floor((1461 * $ya)/4);
  $j += floor(((153 * $month) + 2) / 5);
  $j += $day + 1721119;
  return $j;
}

på php.net, men det vil ikke helt som jeg vil.
Avatar billede detox Nybegynder
10. februar 2004 - 16:56 #14
Hvis du bruger linux, skal du huske: --enable-calendar når du compiler php.
Den workarround du har fundet virker ellers osse fint hos mig.
Avatar billede donslund Nybegynder
10. februar 2004 - 16:59 #15
jeg bruger ikke linux.
Men kan jeg bruge denne funtiokn sammen med dit stykke kode sådan uden videre?
Avatar billede detox Nybegynder
10. februar 2004 - 17:03 #16
I windows burde det virke. Hvad mener du når du siger den brokker sig over funktionen?
Avatar billede detox Nybegynder
10. februar 2004 - 17:04 #17
Ellers kan du sikkert godt indsætte den funktion du har fundet, men så er der vel osse problemer med de andre to funktioner.
Avatar billede donslund Nybegynder
10. februar 2004 - 17:05 #18
Dette vil jeg sætte ind i sidens <HEAD>

function GregorianToJD ($month,$day,$year) {
  if ($month > 2) {
      $month = $month - 3;
  } else {
      $month = $month + 9;
      $year = $year - 1;
  }
  $c = floor($year / 100);
  $ya = $year - (100 * $c);
  $j = floor((146097 * $c) / 4);
  $j += floor((1461 * $ya)/4);
  $j += floor(((153 * $month) + 2) / 5);
  $j += $day + 1721119;
  return $j;
}

og længere nede vil jeg så bruge dette:

$Months = array("Jan"=>"Januar", "Feb"=>"Februar", "Mar"=>"Marts", "Apr"=>"April", "May"=>"Maj", "Jun"=>"Juni", "Jul"=>"Juli", "Aug"=>"August", "Sep"=>"September", "Oct"=>"Oktober", "Nov"=>"November", "Dec"=>"December");
$Days = array("Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag");

$CreateDate = "1949-04-27";

list ($CreateYear, $CreateMonth, $CreateDay) = explode ("-", $CreateDate);
$jd = GregorianToJD($CreateMonth, $CreateDay, $CreateYear);
$MonthName = $Months[JDMonthName($jd,0)];
$DayName = $Days[JDDayOfWeek($jd,0)];

$datostr = "$DayName d. $CreateDay. $MonthName $CreateYear";

Kan jeg det, eller skal der laves noget om?
Avatar billede detox Nybegynder
10. februar 2004 - 17:12 #19
Det er ikke til at sige, når jeg ikke ved, hvad du mener med "den brokker sig". Du er nok nødt til at prøve og se.
Avatar billede donslund Nybegynder
10. februar 2004 - 17:18 #20
Fatal error: Call to undefined function: gregoriantojd() in /customers/mctorsdagsklubben.dk/mctorsdagsklubben.dk/httpd.www/medlem/visperson.php on line 34

Linie 34 --> $jd = GregorianToJD($CreateMonth, $CreateDay, $CreateYear);
Avatar billede detox Nybegynder
10. februar 2004 - 17:22 #21
Ja, så må du prøve den workarround, men måske får du så de samme problemer med de to andre funktioner:
JDMonthName() og JDDayOfWeek().
Avatar billede donslund Nybegynder
10. februar 2004 - 17:23 #22
Okay. Der er ikke noget at gøre ved det. Jeg forsøger, at finde en løsning.
Avatar billede donslund Nybegynder
15. februar 2004 - 21:10 #23
Jeg har valgt blot at vise datoerne som 27.04.1949
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester