write DXLog stuff
[spider.git] / perl / Julian.pm
1 #
2 # various julian date calculations
3 #
4 # Copyright (c) - 1998 Dirk Koopman G1TLH
5 #
6 # $Id$
7 #
8
9 package Julian;
10
11 use FileHandle;
12 use DXDebug;
13 use Carp;
14
15 use strict;
16
17 my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
18
19 # take a unix date and transform it into a julian day (ie (1998, 13) = 13th day of 1998)
20 sub unixtoj
21 {
22   my $t = shift;
23   my ($year, $day) = (gmtime($t))[5,7];
24   
25   if ($year < 100) {
26     $year += ($year < 50) ? 2000 : 1900;
27   }
28   return ($year, $day+1);
29 }
30
31 # take a unix and return a julian month from it
32 sub unixtojm
33 {
34         my $t = shift;
35         my ($mon, $year) = (gmtime($t))[4..5];
36         return ($year, $mon);
37 }
38
39 # take a julian date and subtract a number of days from it, returning the julian date
40 sub sub
41 {
42   my ($year, $day, $amount) = @_;
43   my $diny = isleap($year) ? 366 : 365;
44   $day -= $amount;
45   while ($day <= 0) {
46     $day += $diny;
47         $year -= 1;
48         $diny = isleap($year) ? 366 : 365;
49   }
50   return ($year, $day);
51 }
52
53 sub add
54 {
55   my ($year, $day, $amount) = @_;
56   my $diny = isleap($year) ? 366 : 365;
57   $day += $amount;
58   while ($day > $diny) {
59     $day -= $diny;
60         $year += 1;
61         $diny = isleap($year) ? 366 : 365;
62   }
63   return ($year, $day);
64
65
66 # take a julian month and subtract a number of months from it, returning the julian month
67 sub subm
68 {
69   my ($year, $mon, $amount) = @_;
70   $mon -= $amount;
71   while ($mon <= 0) {
72     $mon += 12;
73         $year -= 1;
74   }
75   return ($year, $mon);
76 }
77
78 sub addm
79 {
80   my ($year, $mon, $amount) = @_;
81   $mon += $amount;
82   while ($mon > 12) {
83     $mon -= 12;
84         $year += 1;
85   }
86   return ($year, $mon);
87
88
89 sub cmp
90 {
91   my ($y1, $d1, $y2, $d2) = @_;
92   return $d1 - $d2 if ($y1 == $y2);
93   return $y1 - $y2;
94 }
95
96 # is it a leap year?
97 sub isleap
98 {
99   my $year = shift;
100   return ($year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)) ? 1 : 0; 
101 }
102
103
104 1;