JDE的Julian Date格式的精确定义是什么?

时间:2009-07-23 11:42:03

标签: date jdedwards julian-date

我正在编写代码以将公历日期转换为JDE(J.D.Edwards)Julian日期。

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

就我可以从谷歌搜索来说,JDE Julian日期的定义是:

1000*(year-1900) + dayofyear

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

我的问题是:1900年之前的年份是否受到支持?如果是的话,上述公式是否仍然适用,或者应该如此:

1000*(year-1900) - dayofyear

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

或其他什么?

是否有人有此日期格式的官方文档的链接?

9 个答案:

答案 0 :(得分:10)

JDE Julian日期包括CYYDDD,即世纪,年,日。

20世纪是零,例如19XX和21比21 20XX。

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

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

请参阅此Oracle页面,获取简单的官方解释:About the Julian Date Format

答案 1 :(得分:2)

"JDE Julian Date Converter"确实会返回负值:

1809/07/23 : -90635

classical Julian Date

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

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

注意:这个“ACC: How to Convert Julian Days to Dates in Access and Back”不支持1900年之前的日期......因为它说的是“非正式”朱利安日,政府机构和承包商常用

  

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

答案 2 :(得分:1)

更新:抱歉,JDE可能还有别的东西。但供参考:

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

  

“如果JD对应瞬间   以动力学的尺度衡量   时间(或星历时间),   表达朱利安星历日   通常使用(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作为Julian日期是用词不当。它是 朱利安 。 JD与朱利安无关 日历。 (这与维基百科的文章不一致 来自上述书籍的作者,Jean Meeus - 一位专门研究天体力学的比利时天文学家。)

答案 3 :(得分:1)

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

在Excel中将Julian转换为日期

在Cell A2中放置一个Julian日期,如102324
在Cell 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中将日期转换为Julian

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

这会将B2转换回102324

答案 4 :(得分: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 ;                                              

答案 5 :(得分: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
    }

答案 6 :(得分: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 Julian Date转换为Gregorian(DD / MM / YYYY),将XXXXXX替换为包含JDE Julian Date的列名:

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

答案 7 :(得分:0)

如果有兴趣的话,我现在有一个简单的方法可以使用时间和时间1970年01月01日午夜。 但这是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;  
}

答案 8 :(得分:0)

哇,在这些答案中有很多复杂的代码只是转换为JDE julian日期和从JDE julian日期转换。 Excel和VBA可以通过简单的方法实现目标。

来自朱利安

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

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

VBA(来自julian date,j,存储为String):

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))

到JULIAN

Excel(假设日期在A1中):

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

VBA(对于Long,j):

j = (Year(d) - 1900) * 1000 + DatePart("y", d)