14

我正在编写代码以将公历日期转换为 JDE ( JDEdwards ) 儒略日期。

注意:JDE儒略日期与术语儒略日期的正常用法不同。

据我从谷歌搜索得出,JDE Julian 日期的定义是:

1000*(year-1900) + dayofyear

其中 year 是 4 位数的年份(例如 2009 年),dayofyear 是 1 月 1 日的 1,全年计数为 365 或 366 的 12 月 31 日(取决于这是否是闰年)。

我的问题是:是否支持 1900 年之前的几年?如果是这样,上面的公式是否仍然成立,或者应该是这样的:

1000*(year-1900) - dayofyear

(注意减号而不是加号。)

或者是其他东西?

有没有人有这个日期格式的官方文档的链接?

4

9 回答 9

12

JDE Julian 日期由 CYYDDD 组成,即 Century、Year、Day of year。

对于 20 日,例如 19XX,Century 为零,而对于 21 日,例如 20XX,Century 是 1。

年份是两位数。所以 101001 是 2001 年 1 月 1 日

如您所见,这将不支持 1900 年之前的日期。

有关简单且官方的解释,请参阅此 Oracle 页面:关于 Julian 日期格式

于 2009-12-15T10:21:32.813 回答
2

JDE Julian Date Converter”确实返回负值:

1809/07/23 : -90635

经典的朱利安日期相反:

The Julian date for CE  1809 July 23 00:00:00.0 UT is
JD 2381986.50000

这是JD EDWARDS (AS/400 软件) Julian Date的示例,但这不是“官方”文档,它似乎不支持 1900 年之前的日期...

注意:这个“ ACC:如何在访问和返回中将儒略日转换为日期”也不支持 1900 年之前的日期......因为它谈到了政府机构和承包商常用的“非正式”儒略日。

本文中使用的非正式儒略日格式是一年中的序数日(例如,儒略日 032 表示 2 月 1 日,或一年中的第 32 天)。
非正式儒略日格式的变化包括使用前面的两位数年份(例如 96032 表示 2/1/96)和用破折号分隔年份(例如 96-032)。
另一种不太流行的儒略日格式使用一位数字年份(例如 6-032)。这些附加格式不能唯一标识世纪或十年。使用这些格式时,您应该仔细考虑后果;例如,儒略日 00061 可以解释为 3/1/2000 或 3/2/1900。

于 2009-07-23T12:04:52.013 回答
1

也许从问题出发,您可以使用以下公式在 Excel 中进行转换:

在 Excel 中将 Julian 转换为日期

在单元格 A2 中放置一个儒略日期,例如 102324
在单元格 B2 中放置这个公式:(复制它)
=DATE(YEAR("01/01/"&TEXT(1900+INT(A2/1000),0)),MONTH("01/01/"&TEXT(1900+INT(A2/1000),0)),DAY("01/01/"&TEXT(1900+INT(A2/1000),0)))+MOD(A2,1000)-1

日期 11/20/02 日期将出现在单元格 B2 中

在 Excel 中将日期转换为朱利安

在单元格 C2 中复制此公式:
=(YEAR(B2)-2000+100)*1000+B2-DATE(YEAR(B2),"01","01")+1

这会将 B2 转换回 102324

于 2009-11-05T00:02:29.333 回答
1

更新:对不起,JDE 可能是别的东西。但供参考:

我知道的 JDE 是不同的。从“天文算法”一书的第 59 页(Jean Meeus,ISBN 0-943396-35-2):

“如果 JD 对应于以动态时间(或星历时间)为单位测量的瞬间,则通常使用 Julian Ephemeris Day (JDE) 表达式。(不是 JED,因为
它有时会写成。'E' 是一种附加到'JD'的索引)“

JD 和 JDE(对于同一时间点)的值接近,因为 UT 和 ET 的差异在分钟的数量级上。例如,ET-UT 在 1990 年为 56.86 秒,在 1900 年为 -2.72 秒。

还有 MJD(修正儒略日):

MJD = JD - 2400000.5

MJD 的零点是 1858-11-17, 0h UT。


请注意,JD as Julian date 是用词不当。这是朱利安。JD与儒略历无关。(这与维基百科的文章不一致,这是来自上述书籍的作者Jean Meeus - 一位专门研究天体力学的比利时天文学家。)

于 2009-09-22T19:23:39.020 回答
1

将以下源代码保存在名为 JDEDATES 的源成员中。使用第一行的 runsqlstm 创建函数。然后你可以做类似的事情

select  jde2date(A1UPMJ), f.* from f00095 f                            

并看到一个真正的约会。

资源:

--RUNSQLSTM SRCFILE(qtxtsrc) SRCMBR(JDEDATES) COMMIT(*NONE)  NAMING(*SQL) 
 -- jde 2 date                                                                    

 create function QGPL/jde2date ( d decimal(7,0))                                  
 returns date                                                                     
 language sql                                                                     
 deterministic                                                                    
 contains sql                                                                     
    SET OPTION DATFMT=*ISO                                                        
 BEGIN                                                                            
  if d=0 then return null;                                                        
  else                                                                            
       return date(digits(decimal(d+1900000,7,0)));                               
  end if;                                                                         
 end;                                                                            -- date 2 jde                                     
 create function QGPL/date2jde ( d date)           
 returns decimal(7,0)                              
 language sql                                      
 deterministic                                     
 contains sql                                      
    SET OPTION DATFMT=*ISO                         
 BEGIN                                             
  if d is null then return 0;                      
  else                                             
  return (YEAR(D)-1900)*1000+DAYOFYEAR(D);         
  end if;                                          
 end ;                                              
于 2013-08-05T18:26:52.737 回答
1

晚了几年,但对于像我这样发现自己在使用这样的遗留系统的其他人,我希望我的一些 java 代码片段可以提供帮助。我正在利用您可以将此 CYYDDD 格式转换为 yyyyDDD 格式并基于此进行解析的事实。

    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Calendar;
    import java.util.SimpleDateFormat;
    
    String jdeJulianDate = "099365"; //Testing with December 31, 1999
    
    // Compile what the year number is
    int centIndex = Integer.parseInt(jdeJulianDate.substring(0,1));
    int yearIndex = Integer.parseInt(jdeJulianDate.substring(1,3));
    int yearNumber = 1900 + (100 * centIndex) + yearIndex;
    
    // Put the year number together with date ordinal to get yyyyDDD format
    String fullDate = String.valueOf(yearNumber) + jdeJulianDate.substring(3,6);
    
    // Date parsing, so need to wrap in try/catch block
    try {
        Date dt = new SimpleDateFormat("yyyyDDD").parse(fullDate);
        // Validate it parses to a date in the same year...
        Calendar cal = new GregorianCalendar();
        cal.setTime(dt);
        if (cal.get(Calendar.YEAR) != yearNumber) {
            // Cases happen where things like 121366 (should be invalid) get parsed, yielding 2022-01-01.
            // Throw exception or what-not here.
        }
    }
    catch (Exception e) {
        // Date parsing error handling here
    }
于 2021-03-24T21:53:05.840 回答
0

在 JDE Julian Date 和 Gregorian 之间来回转换的 VBA 代码示例:

Public Const Epoch = 1900
Public Const JDateMultiplier = 1000
Public Const FirstJan = "01/01/"

Public Function Julian2Date(ByVal vDate As Long) As Date

    Dim Year As Long
    Dim Days As Long
    Dim SeedDate As Date

    '   Day Number
    Days = vDate - (Int(vDate / JDateMultiplier) * JDateMultiplier) - 1
    '   Calendar Year
    Year = ((vDate - Days) / JDateMultiplier) + Epoch
    '   First Day of Calendar Year
    SeedDate = CDate(FirstJan + CStr(Year))

    '   Add Number of Days to First Day in Calendar Year
    Julian2Date = DateAdd("d", Days, SeedDate)

End Function

Public Function Date2Julian(ByVal vDate As Date) As Long

    Dim JYear As String
    Dim BeginDate As Date
    Dim JDays As Long

    '   Calendar Year
    JYear = Format(Year(vDate), "0000")
    '   First Day of Calendar Year
    BeginDate = CDate(FirstJan + JYear)
    '   Day Number
    JDays = DateDiff("d", BeginDate, vDate) + 1

    '   Add Number of Days to Year Number
    Date2Julian = ((CLng(JYear) - Epoch) * JDateMultiplier) + JDays

End Function

我试图让它尽可能清晰和简单,为此我故意省略了任何错误陷阱。但是,您应该能够将代码添加到 VBA 模块并直接从您自己的代码中调用它们。

我还包括一些有用的 T-SQL 片段:

今天的日期为 JDE 朱利安日期:

 (datepart(yy,getdate())-1900) * 1000 + datepart(dy, getdate())

将 JDE 儒略日期转换为公历 (DD/MM/YYYY),将 XXXXXX 替换为包含 JDE 儒略日期的列名:

convert (varchar, dateadd (day,convert (int, right(XXXXXX,3)) - 1, convert (datetime, ('1/1/' + convert ( varchar, (cast(left(right(XXXXXX+1000000,6),3) as varchar) + 1900))))),103)

如果您需要不同的公历格式,请将 103 值(位于末尾)替换为此处的适用值:https ://msdn.microsoft.com/en-us/library/ms187928.aspx

于 2015-03-18T12:01:37.903 回答
0

如果有人感兴趣,我有一个简单的方法来使用现在的时间和 1970 年 1 月 1 日午夜 1 点的 C。但这适用于 Julian Day Numbers,它与 JDE 不同,但它们在使用数学计算天数方面是相似的,我相信这个想法可以适用于 JDE。有时人们会像我一样混淆这两者。对不起。但这仍然是一个使用时间参考的示例,应该始终使用它,并且由于大多数计算机都使用它,因此我们也很容易不要太拘泥于日期,而只使用这个时代之前或之后的几天。

由于 JDE 现在归 Oracle 所有,因此它们现在也支持 Julian_Day。请参阅: https ://docs.oracle.com/javase/8/docs/api/java/time/temporal/JulianFields.html

#include <stdio.h>
#include <time.h>
#define EPOCH (double)  2440587.5 /* Julian Day number for Jan. 01, 1970 midnight */
int main ()
{
 double days = time(0)/86400.0;

 printf ("%f days since January 1, 1970\n", days);

 printf ("%f\n", days + EPOCH);

 return 0;  
}
于 2015-05-22T16:47:40.063 回答
0

哇,其中一些答案中有很多复杂的代码,只是为了在 JDE 朱利安日期之间进行转换。Excel 和 VBA 中有一些简单的方法可以实现。

来自朱利安

Excel(假设朱利安日期在 A1 中):

=DATE(1900+LEFT(A1,LEN(A1)-3),1,RIGHT(A1,3))

VBA(来自朱利安日期,j,存储为字符串):

d = DateSerial(1900 + Left$(j, Len(j) - 3), 1, Right$(j, 3))

VBA(来自朱利安日期,j,存储为 Long):

d = DateSerial(1900 + Left$(j, Len(CStr(j)) - 3), 1, Right$(j, 3))

致朱利安

Excel(假设日期在 A1 中):

=(YEAR(A1)-1900)*1000+A1-DATE(YEAR(A1),1,0)

VBA(到龙,j):

j = (Year(d) - 1900) * 1000 + DatePart("y", d)
于 2015-06-27T22:23:30.930 回答