note 64056 modified in function.jdtofrench by danbrown
| From: | danbrown@php.net | Date: | Sun, 20 Jul 2008 02:05:40 +0000 |
| Subject: | note 64056 modified in function.jdtofrench by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-141938@lists.php.net to get a copy of this message | ||
Here is a small piece of code to obtain the string data for a correctly converted gregorian date:
<?php
$arDateFrench = gregorian2FrenchDateArray(11, 9, 1799) ;
echo $arDateFrench[1] . " " . $arDateFrench[0] . " " . $arDateFrench[2] ;
/* the output will be:
18 Brumaire VIII
*/
function gregorian2FrenchDateArray($m, $d, $y)
{
$julian_date = gregoriantojd($m, $d, $y);
$french = jdtofrench($julian_date);
if($french == "0/0/0")
return "" ;
$arD = split("/", $french) ;
// get the month name
$monthname = FrenchMonthNames($arD[0]) ;
/* convert the year number to roman digits (as most historians do and documents of the time did */
$stryear = decrom($arD[2]) ;
return array($monthname, $arD[1], $stryear ) ;
}
function FrenchMonthNames($mo)
{
/* The names have been invented by Fabre d'Ãglantine, a second or rather third rank poet
of primarily pastoral poems, with each name referring to the respective period in the agricultural
year; e.g. "Vendémiaire" (approx. September) is derived from "vendange"
("harvest"), "Brumaire" (Ocotober/November) from "brume"
("fog") and so on ... */
$arMo = array("Vendémiaire",
"Brumaire",
"Frimaire",
"Nivôse",
"Pluviôse",
"Ventôse",
"Germinal",
"Floréal",
"Prairial",
"Messidor",
"Thermidor",
"Fructidor",
"Sansculottide") ;
if($mo < count($arMo)+1)
return $arMo[$mo-1] ;
}
function decrom($dec){
$digits=array(
1 => "I",
4 => "IV",
5 => "V",
9 => "IX",
10 => "X",
40 => "XL",
50 => "L",
90 => "XC",
100 => "C",
400 => "CD",
500 => "D",
900 => "CM",
1000 => "M"
);
krsort($digits);
$retval="";
foreach($digits as $key => $value){
while($dec>=$key){
$dec-=$key;
$retval.=$value;
}
}
return $retval;
}
?>
--was--
ignivs remarks have been very helpful, as older versions of the documentation had an error
Nevertheless his code example can be a bit misleading:
$julian_date = juliantojd("09","18","1793");
$french_date = jdtofrench($julian_date);
echo $french_date; //will print 1/8/2
//Enjoy
e.g. for the date of Napoleon's coup d'état (which was November 9, 1799)
the code will return:
"2/29/8" ;
which is WRONG: the day Napoleon overthrew the Directoire to become "Consul" of the French
Republic (and later Emperor) was the
18th Brumaire (2nd month in the revolutionary calendar) of Year VIII.
The writer of the function assumed, quite reasonably in the context of the other calendar related
functions, that the regular input date is JULIAN (even if this doesn't make very much sense in
most contexts; converting the date of the old Russian calendar to the French revolutionary calendar
might be a funny exercise, yet one which, in most cases, doesn't tend to be really necessary or
helpful)
In short, to obtain a correct output, a standard date should be converted using the function
gregoriantojd().
Here is a small piece of code to obtain the string data for a correctly converted gregorian date:
<?php
$arDateFrench = gregorian2FrenchDateArray(11, 9, 1799) ;
echo $arDateFrench[1] . " " . $arDateFrench[0] . " " . $arDateFrench[2] ;
/* the output will be:
18 Brumaire VIII
*/
function gregorian2FrenchDateArray($m, $d, $y)
{
$julian_date = gregoriantojd($m, $d, $y);
$french = jdtofrench($julian_date);
if($french == "0/0/0")
return "" ;
$arD = split("/", $french) ;
// get the month name
$monthname = FrenchMonthNames($arD[0]) ;
/* convert the year number to roman digits (as most historians do and documents of the time did */
$stryear = decrom($arD[2]) ;
return array($monthname, $arD[1], $stryear ) ;
}
function FrenchMonthNames($mo)
{
/* The names have been invented by Fabre d'Ãglantine, a second or rather third rank poet
of primarily pastoral poems, with each name referring to the respective period in the agricultural
year; e.g. "Vendémiaire" (approx. September) is derived from "vendange"
("harvest"), "Brumaire" (Ocotober/November) from "brume"
("fog") and so on ... */
$arMo = array("Vendémiaire",
"Brumaire",
"Frimaire",
"Nivôse",
"Pluviôse",
"Ventôse",
"Germinal",
"Floréal",
"Prairial",
"Messidor",
"Thermidor",
"Fructidor",
"Sansculottide") ;
if($mo < count($arMo)+1)
return $arMo[$mo-1] ;
}
function decrom($dec){
$digits=array(
1 => "I",
4 => "IV",
5 => "V",
9 => "IX",
10 => "X",
40 => "XL",
50 => "L",
90 => "XC",
100 => "C",
400 => "CD",
500 => "D",
900 => "CM",
1000 => "M"
);
krsort($digits);
$retval="";
foreach($digits as $key => $value){
while($dec>=$key){
$dec-=$key;
$retval.=$value;
}
}
return $retval;
}
?>
http://php.net/manual/en/function.jdtofrench.php