爪哇一年中的朱利安日

我在http://www.rgagnon.com/javadetails/java-0506.html上看过“解决方案”,但它无法正常工作。 例如,昨天(6月8日)应该是159,但它说它是245。

那么,有人在Java中有一个解决方案来获取当前日期的三位数朱利安日(不是朱利安日期 – 我需要今年的那一天)吗?

谢谢! 标记

如果您想要的是每年的日期,为什么不使用GregorianCalendars DAY_OF_YEAR字段?

 import java.util.GregorianCalendar; public class CalTest { public static void main(String[] argv) { GregorianCalendar gc = new GregorianCalendar(); gc.set(GregorianCalendar.DAY_OF_MONTH, 8); gc.set(GregorianCalendar.MONTH, GregorianCalendar.JUNE); gc.set(GregorianCalendar.YEAR, 2010); System.out.println(gc.get(GregorianCalendar.DAY_OF_YEAR)); } 

}

或者,您可以计算今天朱利安日期与今年1月1日之间的差异。 但是一定要在结果中加1,因为1月1日不是一年中的第0天:

 int[] now = {2010, 6, 8}; int[] janFirst = {2010, 1, 1}; double dayOfYear = toJulian(now) - toJulian(janFirst) + 1 System.out.println(Double.valueOf(dayOfYear).intValue()); 
 DateFormat d = new SimpleDateFormat("D"); System.out.println(d.format(date)); 
 import java.util.Calendar; // ... final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR); 

请注意,这并未考虑您引用的奇怪网站声称的“中午开始”交易。 只需检查当然的时间就可以解决这个问题。

如果我们得到双重朱利安日期,如和弦决策经理

http://java.ittoolbox.com/groups/technical-functional/java-l/java-function-to-convert-julian-date-to-calendar-date-1947446

以下是工作但第二个没有处理我如何在Java日期和朱利安日数之间转换?

public static String julianDate(String julianDateStr){

  try{ // Calcul date calendrier Gr?gorien ? partir du jour Julien ?ph?m?ride // Tous les calculs sont issus du livre de Jean MEEUS "Calcul astronomique" // Chapitre 3 de la soci?t? astronomique de France 3 rue Beethoven 75016 Paris // Tel 01 42 24 13 74 // Valable pour les ann?es n?gatives et positives mais pas pour les jours Juliens n?gatifs double jd=Double.parseDouble(julianDateStr); double z, f, a, b, c, d, e, m, aux; Date date = new Date(); jd += 0.5; z = Math.floor(jd); f = jd - z; if (z >= 2299161.0) { a = Math.floor((z - 1867216.25) / 36524.25); a = z + 1 + a - Math.floor(a / 4); } else { a = z; } b = a + 1524; c = Math.floor((b - 122.1) / 365.25); d = Math.floor(365.25 * c); e = Math.floor((b - d) / 30.6001); aux = b - d - Math.floor(30.6001 * e) + f; Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, (int) aux); double hhd= aux-calendar.get(Calendar.DAY_OF_MONTH); aux = ((aux - calendar.get(Calendar.DAY_OF_MONTH)) * 24); calendar.set(Calendar.HOUR_OF_DAY, (int) aux); calendar.set(Calendar.MINUTE, (int) ((aux - calendar.get(Calendar.HOUR_OF_DAY)) * 60)); // Calcul secondes double mnd = (24 * hhd) - calendar.get(Calendar.HOUR_OF_DAY); double ssd = (60 * mnd) - calendar.get(Calendar.MINUTE); int ss = (int)(60 * ssd); calendar.set(Calendar.SECOND,ss); if (e < 13.5) { m = e - 1; } else { m = e - 13; } // Se le resta uno al mes por el manejo de JAVA, donde los meses empiezan en 0. calendar.set(Calendar.MONTH, (int) m - 1); if (m > 2.5) { calendar.set(Calendar.YEAR, (int) (c - 4716)); } else { calendar.set(Calendar.YEAR, (int) (c - 4715)); } SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); //System.out.println("Appnumber= "+appNumber+" TimeStamp="+timeStamp+" Julian Date="+julianDateStr+" Converted Date="+sdf.format(calendar.getTime())); return sdf.format(calendar.getTime()); }catch(Exception e){ e.printStackTrace(); } return null; } 

我已经阅读了所有的post,而且我认为还不是很清楚。

user912567提到Jean Meeus,他是绝对正确的

我发现的最准确的定义是由Jean Meeus在其“天文算法”一书中给出的(必须有,真的……)。

朱利安日期是一个日期 ,通常表示,有一年,一个月和一天。

朱利安日是一个数字 (一个实数),从-4712年算起,是“……连续数天……”(以及一天中的一小部分)。 用于精确天文计算的有用时间尺度。

Jean Meeus:“儒略日与朱利安历法无关”(“天文算法”,第2版,第59页)

TL;博士

 LocalDate.now( ZoneId.of( “America/Montreal” ) ).getDayOfYear() 

“朱利安日”术语

术语“朱利安日”有时被宽泛地用于表示一年中的序数日,或者序数日期 ,表示1到365或366( 闰年 )的数字。 1月1日是1月,1月2日是2月,12月31日是365 (或闰年366 )。

这种对Julian宽松(不正确)使用可能来自天文学和其他追踪日期领域的使用,这是自公元前4713年1月1日世界时间中午以来的连续天数(在儒略历上 )。 如今,朱利安的日期接近2,457,576十万,今天为2,457,576

java.time

Java 8及更高版本中内置的java.time框架提供了一个简单的工具来获取日期。

LocalDate类表示没有时间且没有时区的仅日期值。 您可以查询一年中的某一天。

 LocalDate localDate = LocalDate.of ( 2010 , Month.JUNE , 8 ); int dayOfYear = localDate.getDayOfYear (); 

转储到控制台。 结果显示,2010年6月8日确实是第159天。

 System.out.println ( "localDate: " + localDate + " | dayOfYear: " + dayOfYear ); 

localDate:2010-06-08 | dayOfYear:159

时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如,法国巴黎午夜过后几分钟,在魁北克蒙特利尔的“昨天”仍然是新的一天。

 ZoneId z = ZoneId.of( “America/Montreal” ); LocalDate today = LocalDate.now( z ); int dayOfYear = today.getDayOfYear (); 

走向另一个方向,从数字到日期。

 LocalDate ld = Year.of( 2017 ).atDay( 159 ) ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

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