2013-02-25 96 views
1

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

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

+0

你用[Time](http://docs.oracle.com/javase/7/docs/api/java/sql/Time.html)类试过吗? – Quirin 2013-02-25 12:33:38

+0

您需要使用[JodaTime](http://joda-time.sourceforge.net/index.html) - JDK中的“JulianCalendar”没有实现。 – 2013-02-25 12:33:52

+0

是否有示例代码显示如何导入和使用该功能? – Josep 2013-02-25 12:39:12

回答

2

尝试JDateTimeJodd。这是通过Julian日期编号执行所有计算的日期 - 时间类。 JdateTime类有友好的用户界面和任何时候你可以得到朱利安日期的价值。例如,您可以用实例磐英毫秒类,然后读儒略日数:

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

如果你有兴趣在具体计算,参见方法TimeUtil#toJulianDate。它基于成熟的天文算法,但它也考虑浮点计算错误。这就是为什么结果是JulianDateStamp,类别分开持有JD整数及其分数,以提供精度高达1毫秒。这个类也有许多测试用例。

+0

看起来不错。包装的名称是什么?我可以在哪里下载它? – Josep 2013-02-25 13:01:00

+0

完整的类名是** jodd.datetime.JDateTime **。它是** jodd-core **模块的一部分。您有各种下载选项:http://jodd.org/download/index.html – igr 2013-02-25 13:03:25

+0

对不起。我的分析师和我在访问存储库时遇到了一些麻烦,所以我最终选择了另一种选择。 – Josep 2013-02-26 08:40:48

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

不,这不是我正在寻找的。我需要天文学家朱利安天数。抱歉。 – Josep 2013-02-25 12:51:14

0

张贴在这里的方法基本上已经解决了我的需求:http://www.rgagnon.com/javadetails/java-0506.html#comment-811614512 你必须采取在考虑,它在中午(12:00 UTC),这比在午夜的日期晚一天返回的时间( 0:00 UTC)。

从毫秒转换为(年,月,日) - 这是上述方法需要的格式 - ,你可以使用这些instruccions:

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

此代码仅使用日期(年,月,日)并不计算时间组件(小时,分钟,秒,毫秒)。 – igr 2013-02-26 09:57:15

+0

再一次,你的观察是正确的。但我觉得转换为(年,月,日)要比转换为Julian Day编号容易得多。这就是为什么我发现上述方法非常有用。 – Josep 2013-02-26 10:21:20

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.ar

Java 8及更高版本自带java.time类,取代了麻烦的旧的传统日期 - 时间类。请参阅Oracle Tutorial。 “自Unix纪元的开始经过的毫秒”

如果你的意思是在UTC(1970-01-01T00:00:00Z)的1970年第一刻的时代,那么我们就可以将您的计数的-毫秒转换成

一个Instant对象。 Instant类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数点后最多九(9)位数字)。

long millisSinceJavaEpoch = Instant.now().toEpochMilli() ; // Simulating your given number of milliseconds since 1970-01-01T00:00:00Z. 
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时,我们想从java.time.temporal.JulianFields类中获得JULIAN_DAY常量。

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). 

这个结果在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.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可能会在此找到一些有用的类别,例如Interval,YearWeek,YearQuarter和fz more


org.threeten.extra.chrono.JulianChronology

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

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

你是否缺少'import'语句?没有这些,目前还不清楚你使用的是哪个“时间”!这也不是很明显,你为什么用“gmtoff”作为“现在”,而“currentTime”不是“现在”。 – 2017-05-05 13:21:46