我需要一个Java方法,从“自Unix时代开始以来经过的毫秒”转换为“自公元前4713年1月1日以来经过的天数”。这个功能已经实现了Java吗?
我尝试了几种选择。其中一些不编译。其中一些与在线可用的转换(http://www.onlineconversion.com/julian_date.htm)不一致。所以,请发布您已经满意地使用过的答案。
答案 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)
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 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_DAY
类java.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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和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