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


我正在编写代码以从公历日期转换为JDE(J.D.Edwards朱利安约会。

注意:a JDE 朱利安日期与该术语的正常使用不同 朱利安约会

至于我可以从谷歌搜索,JDE朱利安日期的定义是:

1000*(year-1900) + dayofyear

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

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

1000*(year-1900) - dayofyear

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

或者是其他东西?

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


4989
2017-07-23 11:42


起源

他们称之为'朱利安'?愚蠢而无益。 - Henk Holterman
是的,我完全同意! - Andy Balaam
请在问题中说明JDE是什么。例如。它是Java开发环境,一个Emacs Lisp包吗? - Peter Mortensen
谢谢 - 我已经更新了这个问题。 - Andy Balaam
我们都可以在这些事情的名义上使用休息。如何为Joseph Justus Scaliger甚至JJS缩写JS。 en.wikipedia.org/wiki/Joseph_Justus_Scaliger。那是什么语言? - Douglas G. Allen


答案:


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

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

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

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

有关简单和官方的解释,请参阅此Oracle页面: 关于朱利安日期格式


10
2017-07-23 12:04



你有参考吗?如果是这样,我可以接受它。 - Andy Balaam
如果您查看Oracle Metalink上的工具文档,您可以在那里找到它(例如,您的JDE版本的工具基础指南),如果您有权访问它。但就我个人而言,我已经在JDE上工作了十多年,并且每天多次使用这种日期格式,我非常了解它:-) - bazscott


“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:如何将Julian Days转换为Access和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
2017-09-22 19:23



谢谢 - 我确实通过谷歌搜索找到了这些链接,但没有一个给我一个确定的答案。也许我是密集的,但我无法猜测macek.cc转换器使用什么公式来获得1809-07-23的这个值。我上面给出的两个公式将给出-90796或-91204。 - Andy Balaam


更新:对不起,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与朱利安无关 日历。 (这与维基百科的文章不一致,这个 来自上述书籍的作者, 让·梅乌斯  - 比利时天文学家,专门研究天体力学。)


1
2017-11-05 00:02





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

在Excel中将Julian转换为Date

在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


1
2017-08-05 18:26





将以下源代码保存在名为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 ;                                              

1
2018-03-18 12:01





在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 Julian日期:

 (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


0
2018-05-22 16:47





如果有兴趣的话,我现在有一个简单的方法可以使用时间和时间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;  
}

0
2018-06-27 22:23