我需要一个 Java 方法,它可以将“自 Unix 纪元开始以来经过的毫秒数”转换为“自公元前 4713 年 1 月 1 日以来经过的天数”。这个功能是否已经实现是Java?
我尝试了几种选择。其中一些不编译。其中一些与在线可用的转换不一致 ( http://www.onlineconversion.com/julian_date.htm )。因此,请仅发布您自己满意地使用的答案。
我需要一个 Java 方法,它可以将“自 Unix 纪元开始以来经过的毫秒数”转换为“自公元前 4713 年 1 月 1 日以来经过的天数”。这个功能是否已经实现是Java?
我尝试了几种选择。其中一些不编译。其中一些与在线可用的转换不一致 ( http://www.onlineconversion.com/julian_date.htm )。因此,请仅发布您自己满意地使用的答案。
试试Jodd的JDateTime。这是一个日期时间类,它在Julian Date Numbers上执行所有计算。JdateTime类具有友好的用户界面,您可以随时获取 Julian Date 的值。例如,您可以使用 epox 毫秒实例化该类,然后读取 Julian Date Number:
JDateTime jdt = new JDateTime(milliseconds);
JulianDateStamp jds = jdt.getJulianDate();
// or:
double jdn = jdt.getJulianDateDouble()
// or:
int jdn = jdt.getJulianDateNumber()
如果您对具体计算感兴趣,请参阅TimeUtil#toJulianDate方法。它基于经过验证的天文算法,但它也考虑到浮点数的计算错误。这就是结果是JulianDateStamp的原因,该类分别保存 JD 整数及其分数,以提供高达 1 毫秒的精度。这个类也写了很多测试用例。
这里发布的方法基本上解决了我的需求:http ://www.rgagnon.com/javadetails/java-0506.html#comment-811614512 你必须考虑到它返回中午的时间(12:00 UTC) ,比午夜 (0:00 UTC) 的日期晚一天。
要将毫秒转换为(年、月、日)——这是上述方法所期望的格式——你可以使用这些指令:
Date date = new Date(longMillis);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // El mes que devuelve Calendar va de 0 a 11.
int day = calendar.get(Calendar.DAY_OF_MONTH);
int[] ymd = new int[] {year, month, day};
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeInMillis(millis);
cal.setGregorianChange(new Date(Long.MAX_VALUE));
int julianDay = cal.get(Calendar.DAY_OF_YEAR);
Time time = new Time();
time.setToNow();
long currentTime = Long.parseLong("1484903678788");
int currentJulianDay = Time.getJulianDay(currentTime, time.gmtoff);
System.out.print(currentJulianDay); // 2457774