Java中的Julian日

时间:2010-06-09 12:03:35

标签: java julian

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

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

谢谢!标记

9 个答案:

答案 0 :(得分:10)

DateFormat d = new SimpleDateFormat("D");
System.out.println(d.format(date));

答案 1 :(得分:6)

import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);

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

答案 2 :(得分:6)

如果您想要的是每年的日期,为什么不使用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());

答案 3 :(得分:2)

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

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

以下是工作但第二个没有处理 How can I convert between a Java Date and Julian day number?

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;

}  

答案 4 :(得分:2)

我已经阅读了所有帖子,而且我认为有些不太清楚。

user912567提到让·梅乌斯,他是绝对正确的

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

朱利安日期是日期,与往常一样,有一年,一个月和一天。

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

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

答案 5 :(得分:1)

TL;博士

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

“朱利安日”术语

术语“朱利安日”有时用于表示一年中的ordinal天,或Ordinal date,表示1到365或366(leap years)之间的数字。 1月1日为1,1月2日为2,12月31日为365(或闰年为366)。

Julian的松散(不正确)使用可能来自use in astronomy以及跟踪日期的其他字段,作为自公元前4713年1月1日世界时间中午以来的连续天数(在{ {3}})。如今,朱利安的日期接近二百五十万,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

Julian calendar框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和&amp; Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

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

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

从哪里获取java.time类?

How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-ExtraIntervalYearWeekYearQuarter

答案 6 :(得分:0)

在@Basil Bourque回答之后,以下是我的实现,该实现使用系统默认的区域ID获取一年中的儒略日。

LocalDate localDate = LocalDate.now(ZoneId.systemDefault());
int julianDay = localDate.getDayOfYear();

答案 7 :(得分:0)

如果您要在day count since 4713 BC中查找儒略日,那么可以改用以下代码:

private static int daysSince1900(Date date) {
    Calendar c = new GregorianCalendar();
    c.setTime(date);

    int year = c.get(Calendar.YEAR);
    if (year < 1900 || year > 2099) {
        throw new IllegalArgumentException("daysSince1900 - Date must be between 1900 and 2099");
    }
    year -= 1900;
    int month = c.get(Calendar.MONTH) + 1;
    int days = c.get(Calendar.DAY_OF_MONTH);

    if (month < 3) {
        month += 12;
        year--;
    }
    int yearDays = (int) (year * 365.25);
    int monthDays = (int) ((month + 1) * 30.61);

    return (yearDays + monthDays + days - 63);
}

/**
 * Get day count since Monday, January 1, 4713 BC
 * https://en.wikipedia.org/wiki/Julian_day
 * @param date
 * @param time_of_day percentage past midnight, i.e. noon is 0.5
 * @param timezone in hours, i.e. IST (+05:30) is 5.5
 * @return
 */
private static double julianDay(Date date, double time_of_day, double timezone) {
    return daysSince1900(date) + 2415018.5 + time_of_day - timezone / 24;
}

以上代码基于https://stackoverflow.com/a/9593736,因此仅限于1900年至2099年之间的日期。

答案 8 :(得分:-1)

您还可以通过以下方式获取“朱利安日期”或“原始日期”:

import java.util.Calendar;
import java.util.Date;

public class MyClass {

  public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    LocalDate myObj = LocalDate.now();
    System.out.println(myObj);
    System.out.println("Julian Date:" + cal.get(Calendar.DAY_OF_YEAR));

  }
}