【问题标题】:Convert a Regular Date to Julian Date and vice versa in Java在 Java 中将常规日期转换为儒略日期,反之亦然
【发布时间】:2013-01-10 06:05:21
【问题描述】:

我编写了一个简单的代码,可以将常规日期转换为儒略日期。

这里是那些需要相同转换的代码:

    public int convertToJulian(String unformattedDate)
    {
    /*Unformatted Date: ddmmyyyy*/
    int resultJulian = 0;
    if(unformattedDate.length() > 0)
    {
     /*Days of month*/
     int[] monthValues = {31,28,31,30,31,30,31,31,30,31,30,31};

     String dayS, monthS, yearS;
     dayS = unformattedDate.substring(0,2);
     monthS = unformattedDate.substring(3, 5);
     yearS = unformattedDate.substring(6, 10);

     /*Convert to Integer*/
     int day = Integer.valueOf(dayS);
     int month = Integer.valueOf(monthS);
     int year = Integer.valueOf(yearS); 

         //Leap year check
         if(year % 4 == 0)
         {
          monthValues[1] = 29;    
         }
         //Start building Julian date
         String julianDate = "1";
         //last two digit of year: 2012 ==> 12
         julianDate += yearS.substring(2,4);

         int julianDays = 0;
         for (int i=0; i < month-1; i++)
         {
          julianDays += monthValues[i];
         }
         julianDays += day;

             if(String.valueOf(julianDays).length() < 2)
             {
              julianDate += "00";
             }
             if(String.valueOf(julianDays).length() < 3)
             {
              julianDate += "0";
             }

        julianDate += String.valueOf(julianDays);
    resultJulian =  Integer.valueOf(julianDate);    
 }
 return resultJulian;
}

此代码将 01.01.2013 转换为 113001

我想要做的是将儒略日期转换为没有时间详细信息的常规日期。 例如:朱利安日期是 113029 ==> 常规日期 29.01.2013

请告诉我你的想法。

谢谢。

【问题讨论】:

    标签: java date converter julian-date


    【解决方案1】:

    如果你想要 113029 ==> 29.01.2013 试试

        String j = "113029";
        Date date = new SimpleDateFormat("Myydd").parse(j);
        String g = new SimpleDateFormat("dd.MM.yyyy").format(date);
        System.out.println(g);
    

    输出

    29.01.2013
    

    【讨论】:

    • 是否有这样的简单代码可以将公历日期转换为儒略日期?
    • 我不确定这是大多数日期的有效解决方案。 4 月 8 日之后的任何一天都是 3 位数字,因此 dd 不应正确解析?处理这种情况的 SimpleDateFormat 中是否存在一些未记录的行为?
    • 你能在这里解释一下模式“Myydd”吗?将“000001”转换为“19991201”,这是不正确的。
    【解决方案2】:
    public static int[] julianToGregorian(double injulian) {
        int JGREG= 15 + 31*(10+12*1582);     
        int jalpha,ja,jb,jc,jd,je,year,month,day;
        double julian = injulian + 0.5 / 86400.0;
        ja = (int) julian
        if (ja>= JGREG) {
            jalpha = (int) (((ja - 1867216) - 0.25) / 36524.25);
            ja = ja + 1 + jalpha - jalpha / 4;
        }
    
        jb = ja + 1524;
        jc = (int) (6680.0 + ((jb - 2439870) - 122.1) / 365.25);
        jd = 365 * jc + jc / 4;
        je = (int) ((jb - jd) / 30.6001);
        day = jb - jd - (int) (30.6001 * je);
        month = je - 1;
        if (month > 12) month = month - 12;
        year = jc - 4715;
        if (month > 2) year--;
        if (year <= 0) year--;
    
        return new int[] {year, month, day};
    }
    

    【讨论】:

    • 感谢您的回复。我尝试了该功能,但我认为它不起作用。我发送了 112304 作为 julian 日期参数,即 30.10.2012 在常规日期。它以整数数组的形式返回 -4406 6 22。
    • 没错,检查aa.usno.navy.mil/data/docs/JulianDate.php,把你的朱利安号放在“朱利安日期”一栏,结果会是JD 112304.000000 is BCE 4406 June 22 12:00:00.0 UT Thursday
    • 在 JD Edwards 数据库中,Julian 中的日期保持为 112304,其中 1 是常数,12 是年份,304 是一年中的某一天。 112304 是 30.10.2012 但你说的转换器包含日期时间详细信息并添加了我不想要的。您发送的功能正在运行,您是对的,但在某种程度上我不需要。谢谢。
    • @tanzer 那些 JD Edwards 日期绝对不是“标准朱利安”日期。看到这个问题:stackoverflow.com/questions/1171208/…
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2020-09-14
    • 2013-11-30
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多