not acceptable: julian day number calculations.
rules are provided here:
http://www.sizes.com/time/cal_gregorian....
you can code in javascript, c, or autoit, or maybe pseudocode.
this is not for a college project. I am stumped trying to produce appropriate math to convert gregorian day number to date and back.
I have this:
func GregorianToDtime($Y,$Mo,$D,$H,$Mi,$S,$ms... byref $dtime) ;do we have to offset these by 1?
;-----function good to 100,000 years if I coded it right.
;-----we will allow for a zero year.
;-----given gregorian date, convert to gregorian day number, then to dtime.
local $days= mod($Y,4)*365*$Y ;Every year whose number is not divisible by 4 without remainder, consists of 365 days;
;$days+=ceil((mod($Y,4) * mod($Y,100)>0)) * 366 * $Y ;this doesn't end up 1 when any mods are zeros! ;every year which is so divisible, but is not divisible by 100, of 366;
;$days+=((mod($Y,4) * mod($Y,100)>0)?1:0) * 366 * $Y ;this doesn't end up 1 when any mods are zeros! ;every year which is so divisible, but is not divisible by 100, of 366;
;this language doesn't have a ternary operator,so we implement as an if statement
local $temp=0
if (mod($Y,4) * mod($Y,100)>0) then ;this doesn't end up 1 when any mods are zeros!
$temp=1
endif
$days += $temp * 366 * $Y ;every year which is so divisible, but is not divisible by 100, of 366;
$days += (int($Y/100) - int($Y/400)) * 366; every year divisible by 100 but not by 400, again of 366.
$days += int($Y/4000) * 365 ;years divisible by 4000 should consist of 365 days.
$days += NumDaysInMonth( $Y,$Mo)
$days += $D
$days -= 1 ;subtract 1 day so days start at 0
$dtime = ($days * 1000*60*60*24) + ($H*1000*60*60) + ($Mi*60*1000) + ($S*1000) + $ms
return $dtime
endfunc
;
http://www.sizes.com/time/cal_gregorian....
func DtimeToGregorian($dtime,byref $Y,byref $Mo,byref $D,byref $H,byref $Mi,byref $S,byref $ms) ;do we have to offset these by 1?
;-----function good to 100,000 years if I coded it right.
$ms=Mod($dtime,1000)
$S=Mod(Int($dtime / 1000),60)
$Mi=Mod(Int($dtime / (1000*60)),60)
$H=Mod(Int($dtime / (1000*60*60)),24)
local $days = int($dtime / (1000*60*60*24))
$days+=1 ;required for conversion due to offset of 1 day in gregorian calendar system
;-----determine the year, it's the biggest number
local $year=0, $year365=int($days/365), $year366=int($days/366)
if (mod($year366,100) * mod($year366,400) > 0 or mod($year365,4) * mod($year366,100) > 0) then
$Y = int($days/366)
$days -= ($Y*366)
elseif (mod($year365,4) > 0 or mod($year365, 4000)>0) then
$Y = int($days/365)
$days -= ($Y*365)
endif
local $i,$monthdays
for $Mo=12 to 1 step -1
$monthdays = SumOfDaysUpTo1stDayOfMonthWithoutYear( $Y,$Mo)
if ($monthdays < $days) then
;-----match!
$days-=NumDaysInMonth($Y,$Mo)
$D=$days
exitloop
endif
next
;-----return an array structure containing the resulting DTime
local $a[8]
$a[0]=7
$a[1]=$Y
$a[2]=$Mo
$a[3]=$D
$a[4]=$H
$a[5]=$Mi
$a[6]=$S
$a[7]=$ms
return $a
endfunc
func LeapIndex($Y)
if (0<>mod($Y, 4)) then
return 0;
elseif (0<>mod($Y, 100)) then
return 1;
elseif (0<>mod($Y, 400)) then
return 0;
else
return 1;
endif
endfunc
func NumDaysInMonth($Y,$Mo)
switch $mo
case 1,8,12
return 31
case 2
return LeapIndex($Y) + 28
case 3,5,7,10
return 31
case 4,6,9,11
return 30
endswitch
endfunc
func SumOfDaysUpTo1stDayOfMonthWithoutYear( $Y,$Mo)
;this is the sum of days up to 1st day of $Mo
local $sum=0,$i
for $i = 1 to $Mo-1
$sum += NumDaysInMonth($Y,$Mo)
next
return $sum+1
endfunc