2

我需要一个 Java 方法,它可以将“自 Unix 纪元开始以来经过的毫秒数”转换为“自公元前 4713 年 1 月 1 日以来经过的天数”。这个功能是否已经实现是Java?

我尝试了几种选择。其中一些不编译。其中一些与在线可用的转换不一致 ( http://www.onlineconversion.com/julian_date.htm )。因此,请仅发布您自己满意地使用的答案。

4

5 回答 5

2

试试JoddJDateTime这是一个日期时间类,它在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 毫秒的精度。这个类也写了很多测试用例。

于 2013-02-25T12:44:49.847 回答
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};
于 2013-02-26T08:37:54.943 回答
0
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTimeInMillis(millis);        
    cal.setGregorianChange(new Date(Long.MAX_VALUE));
    int julianDay = cal.get(Calendar.DAY_OF_YEAR);
于 2013-02-25T12:48:19.410 回答
0
于 2017-02-07T03:52:45.473 回答
0
    Time time = new Time();
    time.setToNow();
    long currentTime = Long.parseLong("1484903678788");
    int currentJulianDay = Time.getJulianDay(currentTime, time.gmtoff);
    System.out.print(currentJulianDay); // 2457774
于 2017-05-05T09:08:02.933 回答