use strict;
use warnings;

# Wenn man nur das Datum braucht:
my ($day, $mon, $year) = (localtime(time))[3,4,5];
$mon ++; $year += 1900;

my $jd = julian_day($day, $mon, $year);
printf("Julianischer Tag fuer den %d.%d.%d = %1.2f\n", 
         $day, $mon, $year, $jd);

($day, $mon, $year) = gregorian_date($jd);
printf("Zurueckgerechnet: %02d.%02d.%04d\n", $day, $mon, $year);

my $tag_im_jahr = int(julian_day($day, $mon, $year)
                      - julian_day(1, 1, $year));

print "Tag im Jahr: $tag_im_jahr\n";


# Julianischer Tag
# Gegeben: tag, monat, jahr
#
# Die gregorianische Kalenderreform wird beruecksichtigt (der Tag, der
# auf den 4. Oktober 1582 folgt ist der 15. October 1582
# Tage nach dem 15. Oktober 1582 werden als "Gregorianischer Kalender"
# bezeichnet. Der Julianische Tag beginnt um 12 Uhr GMT (Mittag).
# Um beliebige Uhrzeiten beruecksichtigen zu koennen, werden die Tage
# nicht als Integer- sondern als Gleitpunktzahlen angegeben.
#
sub julian_day #($day, $month, $year)
  {
  my ($atmp,$btmp, $monthp, $yearp, $ctmp);
  my ($day, $month, $year) = @_;
  if ($month > 2) 
    {
    $monthp = $month + 1;
    $yearp = $year;
    }
  else
    {
    $monthp = $month + 13;
    $yearp = $year - 1;
    }
  if (($year > 1582) || ($year == 1582 && $month >= 10)
     || ($year == 1582 && $month ==10 && $day >= 15))
    {
    $atmp = $year / 100;
    $btmp = 2 - $atmp + ($atmp / 4);
    }
  else
    { $btmp = 0; }
  $atmp = 365.25 * $yearp;
  $ctmp = $atmp;
  $atmp = 30.6001 * $monthp;
  $ctmp =  $ctmp + $atmp;
  return ($ctmp + $day + 1720994.5 + $btmp);
  }

# Umrechnung Julianischer Tag in (Tag, Monat, Jahr) 
sub gregorian_date #(jday)
  {
  my ($atmp, $btmp, $ctmp, $dtmp, $etmp, $ftmp, 
      $gtmp, $ztmp, $tag, $monat, $jahr);
  my $jday = shift;
  
  $ztmp = int($jday + 0.5);
  $ftmp = ($jday + 0.5) - $ztmp;
  if ($ztmp >= 2299161) 
    {
    $gtmp = int(($ztmp - 1867216.25) / 36524.25);
    $atmp = $ztmp + 1 + $gtmp - int($gtmp/4);
    }
  else
    { $atmp = $ztmp; }
  $btmp = $atmp + 1524;
  $ctmp = int(($btmp-122.1)/365.25);
  $dtmp = int(365.25 * $ctmp);
  $etmp = int(($btmp - $dtmp) / 30.6001);
  $tag = $btmp - $dtmp - int(30.6001 * $etmp) + $ftmp;
  if ($etmp > 13.5)
    { $monat = $etmp - 13; }
  else
    { $monat = $etmp - 1; }
  if ($monat > 2.5)
    { $jahr = $ctmp - 4716; }
  else
    { $jahr = $ctmp - 4715; }
  return($tag, $monat, $jahr);
  }

__END__

Das ginge noch einfacher:

use Date::DateCalc;

$date_conv=new Date::Convert::Julian($date);
@date_conv=$date_conv->date;
convert Date::Convert::Gregorian $date_conv;
print $date->date_string, "\n";

