我需要一种Java方法,它可以从“Unix时代开始以来的经过的毫秒数”转换为“自公元前4713年1月1日以来的经过的天数”。这个功能是否已经实现了Java?如何将毫秒转换为Java中的Julian日数?
我试过了几个选项。其中一些不编译。其中一些与在线(http://www.onlineconversion.com/julian_date.htm)可用的转换不一致。所以,请只发布你已经满意地使用自己的答案。
我需要一种Java方法,它可以从“Unix时代开始以来的经过的毫秒数”转换为“自公元前4713年1月1日以来的经过的天数”。这个功能是否已经实现了Java?如何将毫秒转换为Java中的Julian日数?
我试过了几个选项。其中一些不编译。其中一些与在线(http://www.onlineconversion.com/julian_date.htm)可用的转换不一致。所以,请只发布你已经满意地使用自己的答案。
尝试JDateTime从Jodd。这是通过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毫秒。这个类也有许多测试用例。
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeInMillis(millis);
cal.setGregorianChange(new Date(Long.MAX_VALUE));
int julianDay = cal.get(Calendar.DAY_OF_YEAR);
不,这不是我正在寻找的。我需要天文学家朱利安天数。抱歉。 – Josep 2013-02-25 12:51:14
张贴在这里的方法基本上已经解决了我的需求: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};
Instant.ofEpochMilli(millisSinceJavaEpoch) // Moment in UTC.
.atOffset(ZoneOffset.UTC) // `OffsetDateTime` object.
.getLong(java.time.temporal.JulianFields.JULIAN_DAY) // `long` such as 2457811.
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类?
- Java SE 8和SE 9后来
- 内置。
- 带捆绑实现的标准Java API的一部分。
- Java 9增加了一些次要功能和修复。在ThreeTen-Backport
- Java SE 6和SE 7
- 大部分的java.time功能后移植到Java 6 & 7。
- Android
- 的ThreeTenABP项目适应ThreeTen-反向移植(上述)为Android特异性。
- 参见How to use ThreeTenABP…。
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可能会在此找到一些有用的类别,例如
Interval
,YearWeek
,YearQuarter
和fz more。
org.threeten.extra.chrono.JulianChronology
那些java.time类由ThreeTen-Extra项目扩展。该项目包括Julian calendar系统的proleptic实施,
JulianChronology
。
Time time = new Time();
time.setToNow();
long currentTime = Long.parseLong("1484903678788");
int currentJulianDay = Time.getJulianDay(currentTime, time.gmtoff);
System.out.print(currentJulianDay); // 2457774
你是否缺少'import'语句?没有这些,目前还不清楚你使用的是哪个“时间”!这也不是很明显,你为什么用“gmtoff”作为“现在”,而“currentTime”不是“现在”。 – 2017-05-05 13:21:46
你用[Time](http://docs.oracle.com/javase/7/docs/api/java/sql/Time.html)类试过吗? – Quirin 2013-02-25 12:33:38
您需要使用[JodaTime](http://joda-time.sourceforge.net/index.html) - JDK中的“JulianCalendar”没有实现。 – 2013-02-25 12:33:52
是否有示例代码显示如何导入和使用该功能? – Josep 2013-02-25 12:39:12