如何在Java中将毫秒转换为Julian Day Number?

时间:2013-02-25 12:30:51

标签: java julian

我需要一个Java方法,从“自Unix时代开始以来经过的毫秒”转换为“自公元前4713年1月1日以来经过的天数”。这个功能已经实现了Java吗?

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

5 个答案:

答案 0 :(得分:2)

JDateTime尝试Jodd。这是日期时间类,它对 Julian Date Numbers 执行所有计算。 JdateTime 类具有友好的用户界面,只要您可以获得Julian Date的值。例如,您可以使用epox毫秒实例化该类,然后读取Julian日期编号:

JDateTime jdt = new JDateTime(milliseconds);
JulianDateStamp jds = jdt.getJulianDate();
// or:
double jdn = jdt.getJulianDateDouble()
// or:
int jdn = jdt.getJulianDateNumber()

如果您对具体计算感兴趣,请参阅方法TimeUtil#toJulianDate。它基于成熟的天文算法,但它也关注浮点的计算误差。这就是为什么结果是 JulianDateStamp ,这个类分别保存JD整数及其分数,以提供高达1毫秒的精度。这个类还编写了许多测试用例。

答案 1 :(得分:1)

此处发布的方法基本上解决了我的需求:http://www.rgagnon.com/javadetails/java-0506.html#comment-811614512 您必须考虑到它在中午(12:00 UTC)返回时间,这比午夜(UTC时间0:00)的日期晚一天。

要将毫秒转换为(年,月,日) - 这是上述方法所期望的格式 - ,您可以使用以下指令:

  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};

答案 2 :(得分:0)

    GregorianCalendar cal = new GregorianCalendar();
    cal.setTimeInMillis(millis);        
    cal.setGregorianChange(new Date(Long.MAX_VALUE));
    int julianDay = cal.get(Calendar.DAY_OF_YEAR);

答案 3 :(得分:0)

TL;博士

Instant.ofEpochMilli( millisSinceJavaEpoch )                   // Moment in UTC.
       .atOffset( ZoneOffset.UTC )                             // `OffsetDateTime` object.
       .getLong( java.time.temporal.JulianFields.JULIAN_DAY )  // `long` such as 2457811.

java.time

Java 8及更高版本附带java.time类,取代了麻烦的旧遗留日期时间类。请参阅Oracle Tutorial

  

"自Unix Epoch"

开始以来经过的毫秒数

如果你的意思是1970年的第一个时刻的世纪(1970-01-01T00:00:00Z),那么我们可以将你的毫秒计数转换为Instant个对象。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

long millisSinceJavaEpoch = Instant.now().toEpochMilli() ;  // Simulating your given number of milliseconds since 1970-01-01T00:00:00Z.
  

1488099298325

Instant instant = Instant.ofEpochMilli( millisSinceJavaEpoch );  // Convert from number to `Instant` object.
  

2017-02-26T08:54:58.325Z

我们需要Instant的日期。我不是朱利安年表的专家,但似乎按照惯例,人们使用UTC映射到现代ISO 8601年表。因此,让我们将Instant转换为OffsetDateTime,其偏移量为ZoneOffset.UTC

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );  // Convert from `Instant` to `OffsetDateTime` with UTC as assigned offset.
  

2017-02-26T08:54:58.325Z

OffsetDateTime我们可以访问TemporalField。正如我们TemporalField的实施,我们希望JULIAN_DAYjava.time.temporal.JulianFields不变。

long jd = odt.getLong( java.time.temporal.JulianFields.JULIAN_DAY );  // Convert to Julian Day (number of whole days since January 1, 4713 BCE in the Julian calendar, a.k.a. -4713-11-24 Gregorian).
  

2457811

此结果与the web site you mentioned给出的结果相符。

code above run live at IdeOne.com

根据您的定义,您可能需要MODIFIED_JULIAN_DAY而不是JULIAN_DAY

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter和fz more

org.threeten.extra.chrono.JulianChronology

这些java.time类由ThreeTen-Extra项目扩展。该项目包括proleptic系统的Julian calendar实施,JulianChronology

答案 4 :(得分:0)

    Time time = new Time();
    time.setToNow();
    long currentTime = Long.parseLong("1484903678788");
    int currentJulianDay = Time.getJulianDay(currentTime, time.gmtoff);
    System.out.print(currentJulianDay); // 2457774