最近我看到了一个不错的javascript库,它可以计算特定日期、纬度和经度的太阳时间。因为我想在我的一些android开发中使用这个库,所以我正在将这个库重写为java。因为用儒略日而不是公历日期计算时间要容易得多,所以我必须把日期转换成儒略日。但要给出某个事件发生的时间,我必须将儒略日数转换为公历日期和时间。
在javascript中,从julian day number到julian day number的转换非常容易。javascript的计算如下:
var dayMS = 1000 * 60 * 60 * 24;
var J1970 = 2440588;
var J2000 = 2451545;
function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }
但是从朱利安日数转换给我带来了很多麻烦。我的上述java javascript版本是:
double dayMs = 1000 * 60 * 60 * 24;
double J1970 = 2440588;
double J2000 = 245154;
public double toJulian(LocalDateTime date) {
ZonedDateTime zdt = date.atZone(ZoneId.of("Europe/Vienna"));
double result = zdt.toInstant().toEpochMilli(); //milliseconds since epoch
result = result / dayMs - 0.5 + J1970;
return result;
}
public String fromJulian(double jdn) {
System.out.println("fromJulian.jdn: " + jdn);
int jalpha,ja,jb,jc,jd,je,year,month,day;
double julian = jdn,
decimal= jdn % 1;
ja = (int) julian;
if (ja>= JGREG) {
jalpha = (int) (((ja - 1867216) - 0.25) / 36524.25);
ja = ja + 1 + jalpha - jalpha / 4;
}
jb = ja + 1524;
jc = (int) (6680.0 + ((jb - 2439870) - 122.1) / 365.25);
jd = 365 * jc + jc / 4;
je = (int) ((jb - jd) / 30.6001);
day = jb - jd - (int) (30.6001 * je);
month = je - 1;
if (month > 12) month = month - 12;
year = jc - 4715;
if (month > 2) year--;
if (year <= 0) year--;
double dhour = decimal * 24;
int hour = (int) Math.round(dhour);
decimal = dhour % 1;
double dminute = decimal * 60;
int minute = (int) Math.round(dminute);
decimal = dminute % 1;
double dsecond = decimal * 60;
int second = (int) Math.round(dsecond);
LocalDateTime ldt = LocalDateTime.of(
year,
month,
day,
hour,
minute,
second
);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("UTC"));
return dtf.format(zdt);
}
javascript和java中的tojulian方法给了我完全相同的值,但是在julian方法中我得到了一个日期,但是完全错误。
例子
日期=“2020年12月26日00:00:00”
javascript:将日期插入函数tojulian并重新插入值( 2459209.4583333335
)进入函数fromculian returns 26 December 00:00:00
.
java:将日期插入函数tojulian并重新插入值( 2459209.4583333335
)进入函数fromculian returns 25 December 11:00:00
.
从两天以来,我尝试了不同的方法来计算公历日期从儒略日数字,但从来没有达到预期的产出。我已经把整个java库上传到github了(https://github.com/stnieder/suncalc_java). 我希望有人能帮我解决这个问题。
1条答案
按热度按时间z9gpfhce1#
编辑:java大致支持julian日数。它正确地计算天数。它并不像朱利安日定义的那样,在中午开始新的一天,它也不支持一天中的一小部分。我们仍然可以使用支持,并作出适当的调整自己。
据我所知,以下方法前后进行一致的转换,并与你从中得到的儒略日数一致
toJulian()
在javascript中。试一试:
输出:
最后一行包含
PT0S
,一段0秒的时间,因此结果与起点没有差异。文档链接:
JulianFields.JULIAN_DAY
.