张金龙的博客分享 http://blog.sciencenet.cn/u/zjlcas 物种适应性、分布与进化

博文

如何计算两日期相差的天数?

已有 11277 次阅读 2010-9-21 11:05 |个人分类:科研笔记|系统分类:科研笔记|关键词:学者| R语言, 天文, 历法, 儒略日

如何计算两日期相差天数?

张金龙

jinlongzhang01@gmail.com

今天讲的日期是公历日期,农历日期由于涉及到朔望月等较为高深的内容,暂时已经超出了本人的能力范围,故先不探讨。

现行的公历随月份及年份天数不同,如何计算两个日期之间相隔多少天?
这里,介绍一种天文上常用的儒略日,并介绍儒略日与公历的相互转换方法,附上相应的R语言程序。
儒略日是天文上常用的一种计时方法,从公元前4713年1月1日格林尼治平太阳间正午12点开始,每增加一天,儒略日增加1,一直向下累加。
(以下内容改写自维基百科)
儒略日是法国学者Joseph Justus Scliger(1540-1609)为纪念他的父亲Julius Caesar Scaliger(1484-1558)在1583年提出来的。   
儒略日的起点确定考虑了太阳、月亮的运行周期,以及古罗马税收的间隔。
Joseph Scliger定义儒略周期为7980年,是因28、19、15的最小公倍数,28×19×15=7980。
其中:
28年为一太阳周期(solar cycle),经过一太阳周期,则星期的日序与月的日序会重复。   
19年为一太阴周期,或称默冬章(Metonic cycle),因235朔望月=19回归年,经过一太阴周期则阴历月年的日序重复。
15年为一小纪(indiction cycle),此为罗马皇帝君士坦丁(Constantine)所颁,每15年评定财产价值以供课税,是古罗马用的一个纪元单位,故以7980年为一儒略周期,而所选的起点公元前4713年,则是这三个循环周期同时开始的最近年份。
在中国科学院紫金山天文台编纂的《中国天文年历》上,有相应年份逐日的儒略日表,可供参考。
还是回到原来的问题,如何计算公历中两个日期相差的天数?办法之一,就是将二者都转换成儒略日,计算其差值。实际上,天文学家也是依靠儒略日来计算天体动态的。

下面是已知日期计算儒略日和已知儒略日计算日期的方法。用R语言写成。

### 已知日期计算儒略日

### y m d

date2jd <- function(y,m,d){

   n=0

   G=0

   if(y*372+m*31+floor(d)>=588829){

   G=1

   }

   if(m<=2) {

   m = m +12

   y = y -1

   }

   if(G) {

   n=floor(y/100)

   n=2-n+floor(n/4)

   }

   res <- floor(365.25*(y+4716)) + floor(30.6001*(m+1)) + d + n - 1524.5

   return(res)

}

 

### 已知儒略日,计算日期的公式

###

 

jd2date <- function(jd){

 

    ### 转换日期格式

    ### 已知儒略日,用jd2date求得到日期,变为年,月,日

    jdate2vect <- function(xxx){

        year = xxx[[1]]

        month = xxx[[2]]

        day <- xxx[[3]]

        frac <- xxx[[6]]/(60*60*24)+xxx[[5]]/(60*24)+xxx[[4]]/24

        day.dec <- day + frac

        res <- c(year, month, day.dec)

        names(res) <- c("Year","Month","Day")

        return(res)

    }

 

   D = floor(jd+0.5)

   F= jd+0.5-D

   if(D>=2299161) {

      c = floor((D-1867216.25)/36524.25)

      D = D + 1+c-floor(c/4);

   }

   D = D + 1524;              

   r.Y = floor((D-122.1)/365.25);

   D = D - floor(365.25*r.Y);  

   r.M = floor(D/30.601);

   D = D- floor(30.601*r.M);  

   r.D = D;

   if(r.M>13){

      r.M=r.M - 13

      r.Y=r.Y  - 4715;

   }

   else{

      r.M =r.M - 1

      r.Y = r.Y- 4716

   }

   F= F*24;

   r.h=floor(F);

   F= F -r.h;

   F = F * 60;

   r.m=floor(F);

   F= F - r.m;

   F = F * 60;

   r.s=F;

   res <- list(r.Y, r.M, r.D, r.h, r.m, round(r.s,2))

   names(res) <- c("Year","Month","Day","Hour","Minute","Second")

   return(jdate2vect(res));

  }

 

 

## 下面分别举例,说明这两个函数的使用方法

 

## date2jd 举例

## 2010921日与198011日相差的天数

date2jd(2010,9,21) - date2jd(1980,1,1)

结果:11221

## 203592日北京日全食距离现在的天数

date2jd(2035,9,2) - date2jd(2010,9,21)

结果:9112

## 求美国独立距离现在的天数

date2jd(2010,9,21) - date2jd(1776,7,4)

结果:85545

## 求公元前84111日(西周共和元年)距离现在的天数

date2jd(2010,9,21) - date2jd(-841,1,1)

结果:1041578

## 儒略日转年月日举例

#已知儒略日为2455230.5,求其对应的公历日期。

jd2date(2455230.5)

结果:

 Year Month   Day

 2010     2     3

 201023日。



https://m.sciencenet.cn/blog-255662-365252.html

上一篇:NotePad++:记事本的替代程序
下一篇:已知经纬度计算两点间地理距离

1 唐常杰

发表评论 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-3-29 23:49

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部